Win32,如何访问工具栏上的按钮

时间:2013-07-18 12:59:18

标签: winapi

假设我有一个已编译的二进制程序,它运行并在屏幕上显示一些GUI。 我需要从Win32中的另一个程序访问其工具栏,找到一个按钮并单击它。

我知道如何找到工具栏的Hwnd,但我真的不知道如何枚举它上面的按钮。 任何想法如何在Win32调用中做到这一点?

是否有像Spy ++这样的工具能够在工具栏下显示按钮手柄? 间谍++不会这样做。

由于

4 个答案:

答案 0 :(得分:4)

如果它是标准的Win32工具栏控件,则您向工具栏发送TB_BUTTONCOUNT消息以确定工具栏上有多少按钮,然后发送TB_GETBUTTON消息以检索有关按钮的信息给定的指数。

棘手的部分是接收按钮信息的TBBUTTON结构需要在拥有工具栏的同一进程中分配,因此您必须:

  1. 调用GetWindowThreadProcessId()以检索工具栏的进程ID
  2. 致电OpenProcess()以获得HANDLE该流程
  3. 致电VirtualAllocEx()以分配该流程内的结构
  4. TB_GETBUTTON消息发送到工具栏,指定VirtualAllocEx()
  5. 返回的指针
  6. 调用ReadProcessMemory()将结构数据复制回您自己的流程,以便您可以根据需要进行处理
  7. 调用VirtualFreeEx()释放分配的内存。

答案 1 :(得分:0)

脱离我的头顶:

使用EnumChildWindows查找工具栏的子控件。

然后使用GetWindowText查看它是否是按钮。

如果它是PostMessage来调用它的操作。

答案 2 :(得分:0)

AFAIR您可以致电GetDlgItem获取工具栏按钮的HWND。第一个参数是工具栏的HWND,第二个参数是按钮的ID(您在TBBUTTON结构中设置的那个)。您需要使用按钮ID才能使用此方法。

===编辑===

除了@ graham.reeds建议的EnumChildWindows之外,您还可以尝试SendInput。将目标窗口移动到前景,计算工具栏左上角的屏幕坐标(使用其HWND),添加目标按钮中间的X-Y偏移,然后向该位置发送鼠标单击。 (我成功地使用这种方法来点击在IE窗口内呈现的Flash和Silverlight对象。)

答案 3 :(得分:0)

单击该按钮时,它会向主窗口发送WM_COMMAND消息。模拟工具栏按钮上的单击并不是很实用。更好的方法是使用Spy ++查找WM_COMMAND消息及其参数。然后在你的程序中发送同样的WM_COMMAND消息。