VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • 【vb.net】获取窗口控件句柄笔记

近期在做一个【在文件另存为窗口快速输入自定义路径字符串】的功能,一开始基本的思路是:

  • 研究分类各种软件的另存为窗口的控件类型、标题
  • 使用FindWindowFindWindowEx找出路径文本框和保存按钮的句柄
  • 使用SendMessageSendMessageEX将自定义路径字符串输入至上述的文本框,并后台模拟点击保存按钮。

基本的思路是没有问题的,如文本编辑器的另存为窗口,使用如下代码可以获取另存为窗口的文本框句柄:

myhwnd = FindWindow(vbNullString, "另存为")
myhwnd = FindWindowEx(myhwnd, 0&, "DirectUIHWND", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "FloatNotifySink", vbNullString) 
myhwnd = FindWindowEx(myhwnd, 0&, "ComboBox", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "Edit", vbNullString)
  • 1
  • 2
  • 3
  • 4
  • 5

但各种各种的另存为窗口,目标文本框和按钮需要清楚父子窗口的控件类名,效率将变得十分低下,而且通用性也不强,例如ps的另存为窗口标题是“存储为”,而不是“另存为”,很多软件的文本框也不是这种非常具体的父子窗口。 因此急需使用另外一种高效的算法来遍历/枚举某一个桌面直接子窗口的所有控件,根据条件(类名标题)找出所需的控件。 【未完待续】 另,使用Spy++参看窗口和控件句柄。 ‘--------------以上记录于2020/3/7 23:00--------------

在研究了一晚后,最终使用GetNextWindow遍历全部桌面直接子窗口,再使用EnumChildWindows配合回调函数EnumChildProcCallback实现【遍历桌面全部直接子窗口,再遍历某个子窗口的全部控件】,只要找到目标文本框和保存按钮,已基本实现目标功能【在文件另存为窗口快速输入自定义路径字符串】,而中间遇到几个小问题:

  • 隐藏的子窗口或者控件(Spy++显示为灰色)可以使用GetWindowLongWS_VISIBLE(&H10000000)判断过滤掉,提高效率。
  • 窗口和控件标题本来使用GetWindowText获取,但未知原因常出现获取不到,所以使用SendMessage获得。

至于另外一个子程序,获得最近打开的资源管理器路径,实现过程大致相同,放在下次笔记中。 ‘--------------以上记录于2020/3/8 09:30--------------

这段时间主要忙于复工复产,所以没有太多时间更新。

上次讲到获得最近打开的资源管理器路径,由于【最近打开的资源管理器路径】其实是第一个CabinetWClass类窗口,层次关系清楚,所以没有使用上文所述的EnumChildWindows获得,可暴力使用以下代码获得:

myhwnd = FindWindow("CabinetWClass", vbNullString)
fhwnd = myhwnd
myhwnd = FindWindowEx(myhwnd, 0&, "WorkerW", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "ReBarWindow32", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "Address Band Root", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "msctls_progress32", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "Breadcrumb Parent", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "ToolbarWindow32", vbNullString)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果myhwnd 为0,代表还存在另外一种可能,使用如下代码获得:

myhwnd = FindWindow("CabinetWClass", vbNullString)
fhwnd = myhwnd
myhwnd = FindWindowEx(myhwnd, 0&, "WorkerW", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "ReBarWindow32", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "Address Band Root", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "msctls_progress32", vbNullString)
myhwnd = FindWindowEx(myhwnd, 0&, "ComboBoxEx32", vbNullString)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

至此 【在文件另存为窗口快速输入自定义路径字符串】功能得以实现,总结实现过程:

  1. 使用**Spy++**参看窗口和控件句柄,分析其层次关系、类名、标题。
  2. 使用GetNextWindow遍历全部桌面直接子窗口,再使用EnumChildWindows配合回调函数EnumChildProcCallback基本可以找到任何你想取得的控件、窗口句柄。
  3. 合理使用FindWindowFindWindowEx 、SendMessageSendMessageEX等API获得类名、标题,模拟输入。

 


相关教程