( 1 ) EnumWindow 函数功能:
枚举所有顶级窗口。函数调用后,系统为每个顶级窗口调用一次回调函数,参数为窗口的句柄和一个附加参数。可以在回调函数中用 GetWindowText 函数得到窗口标题,再用 strstr 等函数查找关键字的方式判断某窗口的存在。
函数原型:
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);
参数说明:
lpEnumFunc :指向定义的回调函数。
lParam :指向一个 32 位的,传递给回调函数的值
返回值:
成功非零值,不成功返回零
备注:
不枚举子窗口,比循环的用 GetWindow 枚举要好。
其它窗口函数还有 FindWindow 、 GetForeGroundWindow 等, FindWindow 利用类名或窗口名获取窗口句柄, GetForeGroundWindow 返回前台窗口(用户当前工作的窗口)。
( 2 ) EnumWindow 的回调函数 EnumWindowsProc
回调函数概念:
在 Windows 编程中,回调函数是一种不会被程序中的函数或过程直接调用,而是由 Windows 操作系统调用的函数。通过回调函数中定义的相应参数,允许 Windows 直接与应用程序进行通信。
函数原型:
BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
);
参数说明:
Hwnd :系统传递来的顶级窗口句柄。
lParam :附加参数
返回值:
继续枚举,返回值虚伪 TRUE ;停止枚举返回值为 FALSE 。
( 3 ) Win32 汇编的 EnumWindow 函数使用 实例
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Shlwapi.inc
includelib Shlwapi.lib ;strstr
.const
szTitle db 'ollydbg',0
szCaption db ' 结果 ',0
szFindOD db ' 发现目标窗口 ',0
szText db ' 枚举已结束 , 没提示发现目标,则没有找到目标窗口 ',0
.code
; 定义回调函数
_CloseWnd proc uses ebx edi esi,_hWnd,_lParam
LOCAL @szBuffer[1024]:BYTE ; 接收窗口标题
invoke IsWindowVisible,_hWnd
.if eax ; 是否是可见的窗口
invoke GetWindowText,_hWnd,addr @szBuffer,sizeof @szBuffer
invoke StrStrI,addr @szBuffer,offset szTitle ; 查找标题中有无字符串 , 不带 I 的大小写敏感
.if eax
invoke MessageBox,NULL,addr szFindOD,addr szCaption,MB_OK
invoke PostMessage,_hWnd,WM_CLOSE,0,0 ; 关闭目标
.endif
.endif
mov eax,TRUE ; 返回 true 时, EnumWindows 继续枚举下一个窗口, false 退出枚举 .
ret
_CloseWnd endp
start:
invoke EnumWindows,addr _CloseWnd,NULL
;EnumWindows 调用,系统枚举所有顶级窗口,为每个窗口调用一次回调函数
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL
end start