假设我有一个已编译的二进制程序,它运行并在屏幕上显示一些GUI。 我需要从Win32中的另一个程序访问其工具栏,找到一个按钮并单击它。
我知道如何找到工具栏的Hwnd,但我真的不知道如何枚举它上面的按钮。 任何想法如何在Win32调用中做到这一点?
是否有像Spy ++这样的工具能够在工具栏下显示按钮手柄? 间谍++不会这样做。
由于
答案 0 :(得分:4)
如果它是标准的Win32工具栏控件,则您向工具栏发送TB_BUTTONCOUNT
消息以确定工具栏上有多少按钮,然后发送TB_GETBUTTON
消息以检索有关按钮的信息给定的指数。
棘手的部分是接收按钮信息的TBBUTTON
结构需要在拥有工具栏的同一进程中分配,因此您必须:
GetWindowThreadProcessId()
以检索工具栏的进程ID OpenProcess()
以获得HANDLE
该流程VirtualAllocEx()
以分配该流程内的结构TB_GETBUTTON
消息发送到工具栏,指定VirtualAllocEx()
ReadProcessMemory()
将结构数据复制回您自己的流程,以便您可以根据需要进行处理VirtualFreeEx()
释放分配的内存。答案 1 :(得分:0)
答案 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消息。