分享

EnumWindow 枚举窗口 .

 doc360sir 2011-10-26

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多