后台窗口没有通过PostMessage()发送消息

时间:2018-02-07 16:55:46

标签: winapi jna user32

我正在尝试使用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。这些都不起作用。

如何向此应用程序发送消息?

1 个答案:

答案 0 :(得分:2)

You can’t simulate keyboard input with PostMessage。它确实适用于某些应用程序,但不适用于所有应用程序,因为它会跳过输入系统的较低级别部分,如挂钩和等待QS_KEY的事物。如果你仍然想以这种方式破解它,你可以使用Spy++来至少判断消息是否被发布到正确的窗口。如果是,它什么都不做,那么你需要寻找其他选择。

如果您正在进行简单的UI自动化,那么SendInput应该是您的首选,或MSAA/UIA如果应用程序不在前台或您需要更多控制权。