EnumWindow 枚举窗口

    技术2026-08-07  7

    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

    最新回复(0)