如何以编程方式将键事件发送到 Java 应用程序中的任何窗口/进程?

cod*_*ark 2 java window process keyevent

使用 Java 应用程序,如何以编程方式将关键事件(字母、数字、标点符号、箭头等)发送/触发到同一台机器上的窗口/进程?

Wil*_*ord 5

假设您知道您可以使用的窗口位置 java.awt.Robot

这会在屏幕上覆盖 10,50 的任何窗口中键入 a。

Robot r = new Robot();
r.mouseMove(10, 50);
r.mousePress(InputEvent.BUTTON1_MASK);
r.mouseRelease(InputEvent.BUTTON1_MASK);
r.keyPress(KeyEvent.VK_A);
r.keyRelease(KeyEvent.VK_A);
Run Code Online (Sandbox Code Playgroud)

如果您有一个窗口,您知道在 10,400 处覆盖 10,50 个,另一个在 400, 400 处覆盖,那么这将在不同的窗口中键入 xy 和 z。在我的测试中,我还需要在移动之前进行一些延迟以使其更可靠。

Robot r = new Robot();
r.mouseMove(10, 50);
r.mousePress(InputEvent.BUTTON1_MASK);
r.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(500);
r.keyPress(KeyEvent.VK_X);
r.keyRelease(KeyEvent.VK_X);
Thread.sleep(500);
r.mouseMove(10, 400);
Thread.sleep(500);
r.mousePress(InputEvent.BUTTON1_MASK);
r.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(500);
r.keyPress(KeyEvent.VK_Y);
r.keyRelease(KeyEvent.VK_Y);
Thread.sleep(500);
r.mouseMove(400, 400);
Thread.sleep(500);
r.mousePress(InputEvent.BUTTON1_MASK);
r.mouseRelease(InputEvent.BUTTON1_MASK);
r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);
Run Code Online (Sandbox Code Playgroud)

  • @android-user 假设窗口不是基于 Java 的(或在同一个 JVM 中),您将需要一个本机实现来查找窗口及其位置,例如 [example](http://stackoverflow.com/questions/1173926 /how-can-i-read-the-window-title-with-jni-or-jna), [示例](http://stackoverflow.com/questions/8717999/how-to-get-list-of- all-window-handles-in-java-using-jna)、[示例](http://stackoverflow.com/questions/27839666/java-jna-find-partial-window-title) 和 [示例](http: //stackoverflow.com/questions/6391439/getting-active-window-information-in-java) (2认同)