求助:如何查找已知句柄的窗口的所有子窗口?

tsunami_liao 2014-04-19 07:04:04
各位大侠,我在用VB.NET 2010 Express做一个小程序的时候碰到了一些问题,由于本人是初学,所以想请大家帮忙看看。

目前我通过process启动一个程序,所以我已知这个程序窗口的句柄,现在想根据这个窗口的句柄,查找他所有的子窗口,直到找到我想要找的窗口(例如:标题为“设置”的窗口),然后再枚举里面的Textbox控件,最后向这个Textbox控件发送回车按键。


目前在网上看有介绍使用EnumChildWindows 函数的,但是很多代码示例我直接用都报错,基本都是基于VB6时代的代码。所以请各位大侠能否给个VB.NET上可行到代码,谢谢!
...全文
448 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chillystar 2014-04-29
  • 打赏
  • 举报
回复
补充一点,刚才我用Spy++看了一下迅雷7,有登录窗口。楼主要找仔细咯
chillystar 2014-04-29
  • 打赏
  • 举报
回复
版主就是版主,一针见血。不过就算没句柄也不要紧,用另外一个api函数sendmessage,不过就是麻烦点。以下是vb6的声明: Declare Function SendMessage Lib "user32" Alias "SendMessageA" (Byval hwnd As Long, Byval wMsg As Long,Byval wParam As Long,lParam As Any) As Long 这东西用起来也很繁琐,但功能很强大,例如腾讯天堂1的登录窗口及帐号密码框也是没有句柄,用这函数照样能实现自动登录。
tsunami_liao 2014-04-26
  • 打赏
  • 举报
回复
谢谢指点,这个可以找到不少窗口,但是好像迅雷的用户登陆窗口是找不到,不知道是为什么?
引用 3 楼 chillystar 的回复:
在vb6是用FindWindowEx 这api函数吧?其实在vb.net也可以用啊。只是将vb6中的long类型改为integer类型。以下是声明方法: vb6:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
虽然vb.net也可以支持declare的声明方法,但既然微软建议不用,那就改一下。vb.net:
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError := True)> _
Public Shared Function FindWindowEx(hWnd1 As Integer, hWnd2 As Integer, lpsz1 As String, lpsz2 As String) As Integer
End Function
另外,vb.net对很多api都封装很好,可能已经实现你需要的功能而不再需要自己去调用api,你说的这类具体参考一下System.Diagnostics.Process下的方法,可能有你需要的。
threenewbee 2014-04-26
  • 打赏
  • 举报
回复
用SPY++看下。 找不到有两个原因,一个是你没有递归,或者遍历的深度不够 一个是那不是具有句柄的控件,而是画出来的。
chillystar 2014-04-25
  • 打赏
  • 举报
回复
在vb6是用FindWindowEx 这api函数吧?其实在vb.net也可以用啊。只是将vb6中的long类型改为integer类型。以下是声明方法: vb6:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
虽然vb.net也可以支持declare的声明方法,但既然微软建议不用,那就改一下。vb.net:
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError := True)> _
Public Shared Function FindWindowEx(hWnd1 As Integer, hWnd2 As Integer, lpsz1 As String, lpsz2 As String) As Integer
End Function
另外,vb.net对很多api都封装很好,可能已经实现你需要的功能而不再需要自己去调用api,你说的这类具体参考一下System.Diagnostics.Process下的方法,可能有你需要的。
良朋 2014-04-22
  • 打赏
  • 举报
回复
If thisControl.GetType.Name = "Textbox" Then thiscontrol.keypress end if next End If Next
良朋 2014-04-22
  • 打赏
  • 举报
回复
For Each frm As Form In Application.OpenForms if frm.Text = "设置" Then For Each thisControl As System.Windows.Forms.Control In frm.Controls

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧