我正在尝试对Windows应用程序进行一些自动化。 为了做我想做的事,我需要一些控件的窗口句柄。
之前,我将使用EnumWindows,EnumChildWindows和GetWindowText的组合来完成此任务。但是现在,一些较新的程序不再具有带按钮的工具栏。 相反,他们有一个功能区。
这对我来说似乎不是什么问题,但现在我注意到功能区上的按钮没有显示在EnumChildWindows中! 或者至少GetWindowText不会返回与屏幕上显示的文本相同的文本。
总而言之: 谁能告诉我如何以编程方式找到功能区上按钮的句柄?
感谢。 问候, LDX
答案 0 :(得分:2)
简单地说,我认为你不能。越来越多的Windows应用程序正在使用GUI框架,这些框架不会使用谨慎的子窗口呈现控件。 Ribbon UI框架似乎就是其中之一。
在不使用子窗口的应用程序中枚举控件的唯一方法是使用辅助功能API:Windows Automation API: UI Automation 是文档中的起点。
答案 1 :(得分:1)
使用Visual Studio(或任何其他类似工具)附带的Spy ++来查看这些按钮是否实际上是窗口。如果是,请使用该工具查看有关它们的详细信息。但是,这个应用程序很可能会在父窗口上下文中自行绘制它们,在这种情况下,您无法获取窗口句柄,因为它们不是真正的窗口。
答案 2 :(得分:1)
好,
所以确实无法掌握这些按钮。 我通过使用SendKeys发送激活按钮的键盘快捷方式解决了这个问题。 在我的情况下,它是保存按钮,所以我使用
INPUT inputs[4];
// press control
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = 0x11; // "VK_Control"
inputs[0].ki.wScan = 0;
inputs[0].ki.dwFlags = 0;
inputs[0].ki.time = 0;
inputs[0].ki.dwExtraInfo = 0;
// press "s"
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 0x53; // "s"
inputs[1].ki.wScan = 0;
inputs[1].ki.dwFlags = 0;
inputs[1].ki.time = 0;
inputs[1].ki.dwExtraInfo = 0;
// release "s"
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 0x53; // "s"
inputs[2].ki.wScan = 0;
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[2].ki.time = 0;
inputs[2].ki.dwExtraInfo = 0;
// release control
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = 0x11; // "VK_Control"
inputs[3].ki.wScan = 0;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].ki.time = 0;
inputs[3].ki.dwExtraInfo = 0;
return SendInput(8, inputs, sizeof(INPUT)) == 8;
也许这可以为遇到同样问题的其他人产生想法:)
GR, LDX
答案 3 :(得分:0)
您可以拥有调用功能区的窗口的句柄。 但你无法掌握你所谓的按钮。
逻辑上:你称之为句柄?你想要HWND吗?如果你想要一个HWND,那么你需要一个窗口...但你唯一的窗口是功能区。
这称为无窗编程。
但是,您可以使用COM技术组件:COM接口IAccesible。
答案 4 :(得分:-1)