我正在尝试使用JNA将消息发送到后台窗口。
然而,没有任何反应。我想也许这个应用程序的行为类似于记事本(你需要找到实际写文本的子窗口),所以我尝试将消息发送到所有子窗口,但仍然没有任何反应。
这是我的代码:
User32 user32 = User32.INSTANCE;
HWND hWnd = user32.FindWindow(null, "MyWindow");
int tid = user32.GetWindowThreadProcessId(hWnd, null);
user32.EnumThreadWindows(tid, new aux(), null);
private class aux implements WNDENUMPROC {
@Override
public boolean callback(HWND hwnd, Pointer pointer) {
User32 user32 = User32.INSTANCE;
char[] title = new char[1024];
user32.GetWindowText(hwnd, title, 1024);
System.out.println(new String(title));
user32.PostMessage(hwnd, WM_KEYDOWN, new WPARAM(VK_Q), new LPARAM(0));
user32.PostMessage(hwnd, WM_KEYUP, new WPARAM(VK_Q), new LPARAM(1));
System.out.println("error: " + Kernel32.INSTANCE.GetLastError());
return true;
}
}
输出:
MyChildWindow1 (= MyWindow)
error: 0
MyChildWindow2
error: 0
MyChildWindow3
error: 0
我尝试过使用PostMessage,PostThreadMessage和SendMessage。这些都不起作用。
如何向此应用程序发送消息?
答案 0 :(得分:2)
You can’t simulate keyboard input with PostMessage。它确实适用于某些应用程序,但不适用于所有应用程序,因为它会跳过输入系统的较低级别部分,如挂钩和等待QS_KEY
的事物。如果你仍然想以这种方式破解它,你可以使用Spy++来至少判断消息是否被发布到正确的窗口。如果是,它什么都不做,那么你需要寻找其他选择。
如果您正在进行简单的UI自动化,那么SendInput
应该是您的首选,或MSAA/UIA如果应用程序不在前台或您需要更多控制权。