【问题标题】:Simulate keypress in java to write user inputs to another application在 java 中模拟按键以将用户输入写入另一个应用程序
【发布时间】:2015-08-04 03:59:02
【问题描述】:

我正在开发一个虚拟键盘应用程序。一切正常,除了我写的东西只写到当前应用程序中,而不是后面运行的那个。

我认为这是因为 Java 中的 ROBOT 类仅适用于创建它的应用程序上下文。

有解决办法吗?

这是代码,我正在尝试在我的 java 应用程序后面的终端中编写 ls

        Robot robot = new Robot();

        robot.keyPress(KeyEvent.VK_ALT);
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_ALT);

        robot.keyPress('l');
        robot.keyRelease('l');
        robot.keyPress('s');
        robot.keyRelease('s');

        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);

【问题讨论】:

标签: java awt awtrobot virtual-keyboard


【解决方案1】:

this example 来看,Robot 类能够将击键发送到外部应用程序 - 但它们会到达topmost window,因此您基本上需要将焦点集中在要发送击键的窗口上,似乎有多种解决方案,我猜这个是最简单的:

https://stackoverflow.com/a/4782350/351861:

或者,您可以编写一个 VBScript 来激活另一个 应用。例如:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.AppActivate("Firefox")

然后使用 Java 应用程序中的 Runtime.exec 来执行脚本。

【讨论】:

  • 当我知道下一个应用程序将是什么应用程序时,您提到的示例工作正常。但在我的情况下,我想使用这个应用程序作为普通物理键盘的替代品。所以我应该能够导航和输入像普通键盘一样。
  • 在这种情况下,你不需要任何东西,这个问题是无效的,因为虚拟键盘正是这样做的——它将击键发送到最顶层的应用程序,没有别的。顺便说一句:“下一个应用程序将是什么”没有任何意义。在任何类型的操作系统中都没有“下一个”,只有图形窗口的 Z 索引,具有最高 Z 值的那个接收广播事件。这就是现代操作系统的工作原理。
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多