【问题标题】:Win32, How to access button on toolbarWin32,如何访问工具栏上的按钮
【发布时间】:2013-07-18 12:59:18
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 为什么不用自动化 API?
  • 自动化 API 是一种访问对象的较慢方式。
  • 我看不到您指定性能限制的问题部分。
  • 希望您注意到我提到“如何在 Win32 中执行此操作”的问题部分?
  • 是的。所以呢。什么时候自动化 API 不是 Win32 的一部分?我不知道您为什么要拒​​绝解决问题的简单有效的方法。

标签: winapi


【解决方案1】:

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

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

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

【讨论】:

  • 这种方法(尽管“正确”)存在全部个问题。不要这样做。为工作使用正确的界面:自动化。而且,@AlekGaisman,虽然我知道这并不总是可能的,但请重新考虑您的设计。如果我同意我明天支付午餐费用,并不意味着我同意让你把手伸进口袋,掏出我的钱包,拿走我的 AmEx。
  • 在这个问题上多次提到“使用自动化代替”,但没有实际示例或链接。任何指向“更好”的方法的指针?我面临与 OP 完全相同的问题。
【解决方案2】:

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

【讨论】:

  • 我理解WM_COMMANDS的概念,但我仍然需要访问按钮,因为按钮是运行进程的唯一状态指示器。
【解决方案3】:

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

=== 编辑 ===

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

【讨论】:

  • 不幸的是我没有按钮 ID,我使用的是 MS Spy++。它只显示一个 ToolbarWindow32 对象,但不显示按钮。是否有任何工具可以深入到工具栏结构
  • @AlexG 从理论上讲,您实际上可以强制将 nIDDlgItem 整数从应用程序中删除。这是我至少正在考虑的一个选项......
【解决方案4】:

在我的头顶上:

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

然后用GetWindowText看是不是按钮。

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

【讨论】:

  • 大多数工具栏上的单个按钮不是具有自己 HWND 的子控件。它们通常只是直接在工具栏上绘制的区域。
  • 现在更有意义了,谢谢
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多