我正在尝试做一些Windows应用程序的自动化。 为了做任何我想做的事情,我需要一些控件的窗口句柄。
之前,我会用EnumWindows,EnumChildWindows和GetWindowText的组合来完成这个任务。 但现在,一些较新的程序不再具有带button的工具栏。 相反,他们有一个丝带。
起初,这对我来说似乎没什么问题,但是现在我注意到function区上的button不会显示在EnumChildWindows中! 或者至lessGetWindowText不会返回与在屏幕上看到的相同的文本。
所以长话短说:有人可以告诉我如何编程方式find一个function区上的button的句柄?
谢谢。 问候,ldx
简而言之,我不认为你可以。 越来越多的Windows应用程序正在使用GUI框架,而不使用谨慎的子窗口来呈现控件。 功能区UI框架似乎是其中之一。
在不使用子窗口的应用程序中枚举控件的唯一方法是使用可访问性API: Windows自动化API:UI自动化是文档中的起点。
使用与Visual Studio(或任何其他类似的工具)附带的Spy ++来查看这些按钮是否实际上是窗口。 如果是,请使用该工具查看关于它们的详细信息。 但是,这个应用程序很有可能在父窗口上下文中自行绘制它们,在这种情况下,您无法获得窗口句柄,因为它们不是真正的窗口。
你可以把窗口的句柄称为功能区。 但是你不能控制你所说的按钮。
逻辑上:你叫什么手柄? 你想要一个HWND吗? 如果你想要一个HWND,那么你需要一个窗口…但你唯一的窗口是功能区。
这被称为无窗口编程。
但是,您可以使用COM技术组件:COM接口IAccesible 。
好的,
所以确实无法处理这些按钮。 我通过使用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