NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows

592 篇文章 440 订阅 ¥299.90 ¥99.00

NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows

在这里插入图片描述在这里插入图片描述

版本
NX9+VS2012

说明
我们可以通过获得NX的父项窗口句柄来遍历下面的子项窗口句柄。

然后对每个句柄单独发送消息,来执行操作。

获得NX窗口句柄用这个函数UF_UI_get_default_parent()

遍历子窗口用这个函数EnumChildWindows

下面的这个例子是遍历类型过滤器句柄,然后模拟鼠标点击,选择下拉类型。

但是这个例子还不够完善,还有很多问题,后续在花点时间不断完善。

本来想得到句柄后,直接用SetWindowText去设置过滤器当前显示的内容,结果还不行。不起作用。

后来又想用SendMessage发送消息,设置显示内容WM_SETTEXT,还是不行,设置下拉枚举第几个也不行。

几种方法试了都不行,才选择了用鼠标模拟点击去做的。

相关参考资料

SendMessage和遍历窗口句柄相关资料

https://bbs.csdn.net/topics/280063280

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答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来获取窗口。 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿飞2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值