如果我们想通过编程来检测某个窗口是否存在,我们通常会使用 Windows API 函数中的
FindWindow(),而且,通常我们又不知道要获得窗口的类名称,所以我们经常性的忽略第一个参数,而是只使用窗口标题来检测窗口,这里就出现了一个问题:若该窗口没有标题或有变化标题(如IE)则我们就需要使用类名称进行查询了。当然,我们可以通过 VS 中提供的
spy++ 这样的工具来获得桌面窗口的类名称,但对于没有安装 VC++ 的朋友想必就要借助第三方软件了,与其这样为什么不自己动手呢?其实,对于整个枚举过程,完全可以基于
EnumWindows() 函数,而我们需要做的,只是给这个函数定义一个布尔类型的回调函数(这里我们命名为
EnumFunc()),并给它赋予两个要求的长整参数
hwnd 和
lParam,最后将自己需要的代码内容写入函数内部。具体代码如下:
如果您使用 VC++ 来编程,那么您可以参考以下代码:
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "string.h"

bool
CALLBACK EnumFunc(HWND hwnd, LPARAM lParam)
{
char sString[2001],sClassName[2001];
int hFunc=GetClassName(hwnd,(LPTSTR)sClassName,2000);
int hFunc2=GetWindowText(hwnd,(LPTSTR)sString,2000);

if(hFunc!=0)
{
if(hFunc2==0)
strcpy(sString,"(无)");
printf("句柄:%ld 标题:%s 类:%s ",hwnd,sString,sClassName);
}
return TRUE;
}

void main(int argc, char*
argv[])
{
if(argc==2)
{
if(argv[1]=="/love")
printf("%s ","I love WYC!");//这是一个彩蛋
}
printf("%s ","取得所有窗口的标题和类名称");
printf("%s ","(C) 2006 Wei CHEN");
if(EnumWindows((WNDENUMPROC)EnumFunc,0)==0)
printf("%s ","枚举出现错误");
}
如果您使用 VB 来编程,那么您可以参考以下方法:
新建一个 标准EXE 工程,并在 Form1 窗体上绘制一个 ListBox 命名为 List1,然后新建一个 模块并声明 API 函数:
然后写入回调函数:
Public Function EnumFunc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim hFunc As Long, hFunc2 As Long
Dim sString As String, sClassName As String

sString = String(2000, Chr(0))
sClassName = String(2000, Chr(0))
hFunc = GetClassName(hwnd, sClassName, 2000)
hFunc2 = GetWindowText(hwnd, sString, 2000)
If hFunc <> 0 Then
If hFunc2 = 0 Then
sString = "(无)"
Else
sString = Left$(sString, InStr(1, sString, Chr(0)) - 1)
End If
Form1.List1.AddItem "句柄:" & hwnd & " 标题:" & sString & " 类:" & sClassName
End If

EnumFunc = True
End Function
最后在
Form1 的
Form_Load() 过程中添加调用:
Private Sub Form_Load()
If InStr(1, Command, "/love", vbTextCompare) _
Then List1.AddItem "I love WYC!" '//这是一个彩蛋
If EnumWindows(AddressOf EnumFunc, 0&) = 0 Then
List1.AddItem "枚举出现错误"
End If
End Sub
这里说明的是,如果没有将回调函数声明为布尔类型或缺少要求的参数程序运行时将出错,如果回调函数结束时并没有设置返回值,只可获得一个窗口的信息。
如果您使用 VC++ 来编程,那么您可以参考以下代码:

































新建一个 标准EXE 工程,并在 Form1 窗体上绘制一个 ListBox 命名为 List1,然后新建一个 模块并声明 API 函数:
Option Explicit
'//要求声明使用的所有变量
Public Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String _
, ByVal cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal _
lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As _
String, ByVal nMaxCount As Long) As Long
'//要求声明使用的所有变量
Public Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String _
, ByVal cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal _
lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As _
String, ByVal nMaxCount As Long) As Long


























