( 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 |
|