获取子窗口句柄EnumChildWindows的威力

转自:http://www.ltesting.net/ceshi/ruanjianceshikaifajishu/rjcskfyy/dotnet/2007/0701/113175.html

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

很早就写过类似spy++和查看密码窗口的东西,一直想给这个小东西再加点特别的。

前段时间对软件安装注册发生了兴趣,有些软件如果你不输入正确注册码,那该死的“下一步”按钮就一直disable。这次我就让spy++彻底spy到底,把那个注册用的按钮置亮,让我轻松进入“下一步”,呵呵...。

我的想法是光标移到指定的窗口上后,探测这个窗口上到底有多少按钮,如果有,就将它们都Enable。

在这里我不想讨论怎样具体实现这个功能,但你要知道的是想得到这些被disable窗口(按钮)的句柄是根本无法通过WindowFromPoint这个API函数得到的,GetWindow也不要妄想了。

顺手查了下MSDN,看到EnumChildWindows可是个好东西,可以枚举一个父窗口的所有子窗口:

BOOL EnumChildWindows(
  HWND
 ,         // handle to parent window // 父窗口句柄
  WNDENUMPROC ,  // callback function // 回调函数的地址
  LPARAM             // application-defined value // 你自已定义的参数
);

就这么简单,让我们再定义一个回调函数,像下面这样:

BOOL CALLBACK EnumChildProc(
  HWND
 ,      // handle to child window
  LPARAM    // application-defined value
);

注意:这个回调函数要么是类的静态函数,要么就是一个全局的函数。

--------------------------------

在调用EnumChildWindows 这个函数时,直到调用到最个一个子窗口被枚举或回调函数返回一个false,否则将一直枚举下去。

有了上面的知识,我想你应该知道怎么做了。


### 回答1: 在VB中,可以使用EnumChildWindows函数来遍历并获取窗口句柄。这个函数可以接受一个回调函数作为参数,用于处理每个窗口句柄。 首先,我们需要声明EnumChildWindows函数,并定义回调函数的原型。在VB中,可以使用Declare语句来声明API函数。为了使用EnumChildWindows,我们还需要定义一个代理函数来调用回调函数。 ``` Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long ``` 接下来,我们可以编写一个递归函数来遍历窗口,并将每个窗口句柄存储在数组中。 ``` Private Sub EnumChildWindowsRecursive(ByVal hwndParent As Long, ByRef hwndArray() As Long, ByRef index As Long) Dim hWndChild As Long hWndChild = 0 ' 获取第一个窗口句柄 hWndChild = GetWindow(hwndParent, GW_CHILD) ' 遍历所有窗口 Do While hWndChild <> 0 ' 将窗口句柄存储在数组中 index = index + 1 ReDim Preserve hwndArray(index) hwndArray(index) = hWndChild ' 递归调用EnumChildWindowsRecursive函数遍历窗口窗口 EnumChildWindowsRecursive hWndChild, hwndArray, index ' 获取下一个窗口句柄 hWndChild = GetWindow(hWndChild, GW_HWNDNEXT) Loop End Sub ``` 最后,我们可以调用EnumChildWindows函数来获取窗口窗口句柄,并将句柄存储在一个数组中。 ``` Private Sub GetChildWindowHandles(ByVal hWndParent As Long) Dim hwndArray() As Long ReDim hwndArray(0) Dim index As Long index = -1 ' 调用EnumChildWindowsRecursive函数获取窗口句柄 EnumChildWindowsRecursive hWndParent, hwndArray, index ' 输出窗口句柄 For i = 0 To UBound(hwndArray) Debug.Print "窗口句柄:" & hwndArray(i) Next i End Sub ``` 现在,我们可以调用GetChildWindowHandles函数,并传入主窗口句柄获取窗口句柄。 ``` Private Sub btnGetChildWindows_Click() ' 获取窗口句柄 Dim hWndParent As Long hWndParent = Me.hwnd ' 获取窗口句柄 GetChildWindowHandles hWndParent End Sub ``` 通过以上的步骤,我们就可以使用VB中的EnumChildWindows函数来遍历并获取窗口句柄了。 ### 回答2: 在VB中,可以使用EnumChildWindows函数来遍历获取窗口句柄EnumChildWindows函数是Windows API中的一个函数,它可以通过回调函数来枚举指定窗口的所有窗口。 首先,我们需要导入以下API声明: ``` Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long Private Delegate Function EnumWindowProc(ByVal hWnd As Long, ByVal lParam As Long) As Long ``` 然后,我们需要定义回调函数(EnumWindowProc)来处理枚举过程中的每个窗口: ``` Private Function EnumWindow(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim strWindow As String * 255 Dim lngResult As Long ' 获取窗口的标题 lngResult = GetWindowText(hWnd, strWindow, 255) ' 在这里可以做一些对窗口的处理 ' 例如,可以将窗口的标题添加到列表框中 If lngResult > 0 Then List1.AddItem strWindow End If ' 继续枚举下一个窗口 EnumWindow = 1 End Function ``` 最后,在需要获取窗口句柄的地方,调用EnumChildWindows函数来进行遍历: ``` Private Sub EnumChildWindowsDemo(hWndParent As Long) EnumChildWindows hWndParent, AddressOf EnumWindow, 0 End Sub ``` 以上代码示例了如何使用VB的EnumChildWindows函数来遍历获取窗口句柄,并将窗口的标题添加到列表框中。在实际使用中,你可以根据需要修改回调函数的逻辑,对窗口进行其他处理操作。 ### 回答3: 在VB中,可以使用枚举ChildWindows函数来遍历获取窗口句柄。接下来是一个示例代码: ``` Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Private Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long ' 处理每个窗口的代码 ' 这里可以根据需要执行进一步的操作,比如保存句柄到数组中 ' lParam参数可以用于传递其他数据给回调函数 'RETURN 1 停止迭代 EnumChildProc = 1 End Function Private Sub GetChildWindowHandles(ByVal hWndParent As Long) ' 调用EnumChildWindows函数来遍历窗口 ' 使用回调函数EnumChildProc处理每个窗口 ' 这里可以将EnumChildProc函数的地址转换为Long型 Dim lpEnumFunc As Long lpEnumFunc = AddressOf EnumChildProc ' 调用EnumChildWindows函数来遍历窗口 EnumChildWindows hWndParent, lpEnumFunc, 0 End Sub Private Sub Form_Load() ' 假设窗口句柄存储在hWnd变量中 Dim hWnd As Long hWnd = Me.hWnd ' 获取窗口句柄 GetChildWindowHandles hWnd End Sub ``` 上述代码中,GetChildWindowHandles过程中调用了EnumChildWindows函数,使用EnumChildProc作为回调函数来处理每个窗口句柄。在EnumChildProc函数中,可以根据需要执行所需的操作,并返回1来停止迭代。最后,在Form_Load事件中调用GetChildWindowHandles来获取窗口句柄。 希望对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值