| ( 1 ) EnumWindow 函數(shù)功能: 枚舉所有頂級窗口。函數(shù)調用后,系統(tǒng)為每個頂級窗口調用一次回調函數(shù),參數(shù)為窗口的句柄和一個附加參數(shù)??梢栽诨卣{函數(shù)中用 GetWindowText 函數(shù)得到窗口標題,再用 strstr 等函數(shù)查找關鍵字的方式判斷某窗口的存在。 函數(shù)原型: BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value ); 參數(shù)說明: lpEnumFunc :指向定義的回調函數(shù)。 lParam :指向一個 32 位的,傳遞給回調函數(shù)的值 返回值: 成功非零值,不成功返回零 備注: 不枚舉子窗口,比循環(huán)的用 GetWindow 枚舉要好。 其它窗口函數(shù)還有 FindWindow 、 GetForeGroundWindow 等, FindWindow 利用類名或窗口名獲取窗口句柄, GetForeGroundWindow 返回前臺窗口(用戶當前工作的窗口)。 ( 2 ) EnumWindow 的回調函數(shù) EnumWindowsProc 回調函數(shù)概念: 在 Windows 編程中,回調函數(shù)是一種不會被程序中的函數(shù)或過程直接調用,而是由 Windows 操作系統(tǒng)調用的函數(shù)。通過回調函數(shù)中定義的相應參數(shù),允許 Windows 直接與應用程序進行通信。 函數(shù)原型: BOOL CALLBACK EnumWindowsProc( HWND hwnd, // handle to parent window LPARAM lParam // application-defined value ); 參數(shù)說明: Hwnd :系統(tǒng)傳遞來的頂級窗口句柄。 lParam :附加參數(shù) 返回值: 繼續(xù)枚舉,返回值虛偽 TRUE ;停止枚舉返回值為 FALSE 。 ( 3 ) Win32 匯編的 EnumWindow 函數(shù)使用 實例 .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 ' 發(fā)現(xiàn)目標窗口 ',0 szText db ' 枚舉已結束 , 沒提示發(fā)現(xiàn)目標,則沒有找到目標窗口 ',0 .code ; 定義回調函數(shù) _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 繼續(xù)枚舉下一個窗口, false 退出枚舉 . ret _CloseWnd endp start: invoke EnumWindows,addr _CloseWnd,NULL ;EnumWindows 調用,系統(tǒng)枚舉所有頂級窗口,為每個窗口調用一次回調函數(shù) invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK invoke ExitProcess,NULL end start | 
|  |