我正在尝试使用C#,FindWindowEx和SendMessage来尝试关闭另一个程序打开的消息框。
我能够获取消息框的句柄并通过Spy ++确认我有正确的句柄。
问题是,当消息框第一次出现时,它没有子节点(也用Spy ++确认)。
手动点击消息框后(用我的鼠标),然后显示子项,我可以找到按钮并以编程方式单击。但在那一点上,它显然毫无用处。
我找到消息框按钮的代码如下所示,其中hwnd是消息框的句柄:
List<IntPtr> buttons = new List<IntPtr>();
IntPtr button_box = User32.FindWindowEx(hwnd, IntPtr.Zero, "QWidget", "qt_msgbox_buttonbox");
if (button_box != IntPtr.Zero) {
IntPtr next_button = IntPtr.Zero;
while (true) {
next_button = User32.FindWindowEx(button_box, next_button, "QWidget", null);
if (next_button != IntPtr.Zero) {
buttons.Add(next_button);
}
else {
break;
}
}
}
再次,一旦孩子们在那里,它发现按钮没有问题。我只需要在他们出现之前点击。
为了“唤醒”孩子们,我尝试以编程方式“点击”框(通过发送WM_LBUTTONDOWN和WM__LBUTTONUP),调用SetForegroundWindow(hwnd),并发送WM_ACTIVATE。这些似乎都不起作用。有什么想法吗?