繁体   English   中英

Java 忽略机器人生成的 VK_Enter 事件

[英]Java ignores VK_Enter event generated by robot

我正在使用机器人编写一些集成测试。 我让机器人打开一个菜单,它应该从菜单中选择一个选项; 除了回车键似乎被忽略了。 菜单将打开并选择正确的菜单项,但是如果我按 Enter 键,则没有采取任何应有的操作。 如果我手动按下适当的键,它会执行预期的操作。 如果我在非 java 应用程序上运行机器人,其他应用程序将正确响应 enter 事件。 所以我已经验证了我正确地发送了一个输入事件,并且 java 菜单应该响应它; 但有些东西不起作用。

我也尝试用空格事件替换输入事件(菜单也应该响应)并且也没有得到响应。

我正在使用最新的 sun JDK 在 redhat linux 上运行。 我很确定这不是我的代码的明显问题,因为我发现这篇文章描述了遇到完全相同问题的人,但它没有解决方案: http://www.velocityreviews.com/forums/t666100-机器人和awt-on-linux.html

private void requestTest(String testName){
    if(testName==currentTest)
        return;
    //overwrite config file with new data
    currentTest=testName;
    overwriteFile(configFile, getCurrentConfigFile());

    //close current graph
    pressKeyCombo(KeyEvent.VK_CONTROL, KeyEvent.VK_F4);

    //open File menu
    pressKeyCombo(KeyEvent.VK_ALT, KeyEvent.VK_F);
    //select the 'load defaults' option
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_SPACE);
}

好吧,我遇到了按 Enter 键的同一个问题。 我也是,当我最终尝试使用 Enter 操作本机操作系统文件选择器对话框时,没有任何解释,但它不起作用。 但似乎可以通过创建另一个机器人 object 来解决该问题,您可以在其中调用 Enter 事件。 因此,请让我至少帮助您或其他路过的孤独冲浪者寻求建议。 ;-)

public static void enterKeyIssueTest() {

    // both lines put some content to the Clipboard
    StringSelection ss = new StringSelection("/fancyUser/tightDir/coolFile.apk");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    // 1st Robot Object
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);   // press Ctrl
    robot.keyPress(KeyEvent.VK_V);         // and press V
    robot.keyRelease(KeyEvent.VK_V);        // release Ctrl
    robot.keyRelease(KeyEvent.VK_CONTROL);  // release V

    // 2nd Robot to my avail
    Robot okRobot = new Robot();

    // presses Enter
    okRobot.keyPress(KeyEvent.VK_ENTER);    // press Enter
    okRobot.keyRelease(KeyEvent.VK_ENTER);  // release Enter
} 

这确实是一个很小的例子,但我希望上面代码中的解释会有所帮助。 事实上,第二个机器人 object 为我做了 Enter 事件。

最好的问候, Semo

我想您的问题是您仅在键为 UP 时触发事件时才使用 VK_DOWN。 我的意思是你应该模拟按键输入事件,即DOWN然后UP。 试试看,我希望这会奏效。

我终于解决了这个问题。 我让我的机器人代码与按钮效果一起在事件调度线程中运行。 这意味着在我的机器人完成执行之前,没有任何按钮可以响应我的机器人的动作。

我不完全确定为什么这会阻止我的机器人在这种情况下正常工作。 我发现如果我删除了 ctrl-F4 命令,机器人会响应 enter 命令,但似乎两个命令都应该在机器人返回的那一刻排队并正确执行。 我假设排队的事件数量有限制,或者我以某种方式结束了两个事件之间的数据竞争。 无论哪种方式,通过将我的机器人移动到一个单独的线程中,我都会得到所需的行为。

顺便说一句,我无法创建 SSCCE 的原因是因为我试图将机器人合并到一个按钮中,并且我尝试让机器人一次执行多个事件; 但我没有尝试使用按钮生成机器人执行多个事件。 要重新创建这个问题,我最终会得到与原始代码一样复杂的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM