2

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

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

有没有像 Spy++ 这样能够在工具栏下显示按钮句柄的工具?Spy++ 不这样做。

谢谢

4

4 回答 4

7

如果它是一个标准的 Win32 工具栏控件,那么您向工具栏发送一条TB_BUTTONCOUNT消息以确定工具栏上有多少按钮,然后发送一条TB_GETBUTTON消息以检索有关给定索引处的按钮的信息。

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

  1. 调用GetWindowThreadProcessId()以检索工具栏的进程 ID
  2. 打电话OpenProcess()HANDLE那个过程
  3. 调用VirtualAllocEx()以分配该进程内部的结构
  4. TB_GETBUTTON消息发送到工具栏,指定返回的指针VirtualAllocEx()
  5. 调用ReadProcessMemory()将结构数据复制回您自己的进程,以便您可以根据需要对其进行处理
  6. 调用VirtualFreeEx()以释放分配的内存。
于 2013-07-18T17:29:52.580 回答
0

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

于 2013-07-18T13:15:44.840 回答
0

AFAIR 你可以HWND通过调用来获得一个工具栏按钮GetDlgItem。第一个参数是HWND工具栏的,第二个参数是按钮的 ID(你在它的TBBUTTON结构中设置的那个)。您需要拥有按钮 ID 才能使用此方法。

=== 编辑 ===

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

于 2013-07-18T13:08:39.663 回答
-1

在我的头顶上:

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

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

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

于 2013-07-18T13:05:58.110 回答