EnumWindows 枚举所有窗口函数功能详解

函数功能:

    该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

函数原型:

    Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);

    参数:
    lpEnumFunc:指向一个应用程序定义的回调函数指针,请参看EnumWindowsProc。
    lPararm:指定一个传递给回调函数的应用程序定义值。

    回调函数原型:
    Private Declare Function EnumWindowsProc Lib "user32" (ByVal hwnd As Long, ByVal LPARAM As Long) As Boolean
    BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

    函数功能:该函数是一个与EnumWindows或EnumDesktopWindows一起使用的应用程序定义的回调函数。它接收顶层窗口句柄。WNDENUMPROC定义一个指向这个回调函数的指针。EnumWindowsProc是应用程序定义函数名的位置标志符。

    参数:
    hwnd:顶层窗口的句柄
    lparam:应用程序定义的一个值(即EnumWindows中lParam)

    返回值:为继续列表,回调函数必须返回TRUE;若停止列表,它必须返回FALSE。

    备注:应用程序必须通过传递给EnumWindows或EnumDesktopWindows应用程序地址来注册这个回调函数。

返回值:

    如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。

备注:

    EnumWindows函数不列举子窗口。
    在循环体中调用这个函数比调用GetWindow函数更可靠。调用GetWindow函数中执行这个任务的应用程序可能会陷入死循环或指向一个已被销毁的窗口的句柄。

速查:

    Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;
    头文件:winuser.h中声明,包含windows.h即可.
    库文件:user32.lib。

举例:
    Option Explicit
   
    'VB 遍历当前所有窗口标题
    '以下内容必须在模块中,AddressOf 只在模块中生效。
    '调用方法:Call EnumWindows(AddressOf EnumWndProc, 0&)
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
   
    Public Function EnumWndProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long  'EnumWindows 遍历窗口的回调函数
        Dim Title1 As String * 255                                                  '处理前窗口标题
        Dim Title2 As String                                                        '处理后窗口标题
        Call GetWindowText(lhWnd, Title1, 255&)                                     '获取窗口标题
        If (InStr(Title1, Chr(0&)) > 0&) Then
            Title2 = Left(Title1, InStr(Title1, Chr(0&)) - 1&)                      '处理空白字符
            If Len(Title2) > 0 Then                                                 '处理空字符
                Debug.Print Title2
            End If
        End If
        EnumWndProc = True                                                          '继续下一个
    End Function