Java 机器人按键在linux中不工作

Java 机器人按键在linux中不工作,java,Java,我使用了Robot类好几次,但在Windows中没有任何问题。 但这次我用的是软呢帽 keyPress(KeyEvent.VK\u窗口)它不工作 如何在linux(Fedora)中模拟按Windows键 注:我甚至尝试了Event.META_MASK,但没有运气使用了以下第一个答案的编辑版本: 您可以使用此程序检查任何钥匙的KeyEvent钥匙代码。对我来说(Fedora19 x86_64,Oracle Java 1.7.0_40 x86_64),元密钥确实映射到了524,根据映射到VK_WIN

我使用了Robot类好几次,但在Windows中没有任何问题。 但这次我用的是软呢帽

keyPress(KeyEvent.VK\u窗口)
它不工作

如何在linux(Fedora)中模拟按Windows键


注:我甚至尝试了
Event.META_MASK
,但没有运气

使用了以下第一个答案的编辑版本:

您可以使用此程序检查任何钥匙的
KeyEvent
钥匙代码。对我来说(Fedora19 x86_64,Oracle Java 1.7.0_40 x86_64),元密钥确实映射到了524,根据映射到
VK_WINDOWS

现在的问题是,当您尝试通过
java.awt.Robot
按键时:

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class RobotTest {

    public static void main(String[] args) {
        Robot r = null;
        try {
            r = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        r.setAutoDelay(250);

        r.keyPress(KeyEvent.VK_WINDOWS);
        r.keyPress(KeyEvent.VK_Z);
        r.keyRelease(KeyEvent.VK_Z);
        r.keyRelease(KeyEvent.VK_WINDOWS);

    }

}
我运行
konsole
的系统快捷方式不是通过使用
Robot
按meta+z触发的

我猜AWT,或者说机器人本身,不知怎么地,正在错误地处理元密钥。也许Java还没有达到Linux中Windows键的使用标准——例如在Gnome外壳键盘快捷键中

我个人会尽量不使用它,或者尝试另一个框架,即EclipseSWT

试图用OpenJDK运行
RobotTest
,没有产生任何更好的结果

robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_CONTROL);

在linux中,windows键被视为ctrl+alt

linux
上的windows键还有什么作用?这是我的要求@MadProgrammer。我好奇的是,linux键盘驱动程序是否真的能识别这个键…@MadProgrammer:通常它被表示为
Meta
。它通常是一个附加的修改键,如Ctrl/Alt/Shift,但其优点是键绑定中发生冲突的风险实际上相对较低。尽管这是Windows键上注册按键的代码(而不是
VK_META
),但该特定代码确实不起作用。已在另一个发行版上确认。因此,除了可能的解决方案之外,您已解释了所有内容。谢谢你的长篇大论,但我没有得到解决方案。你最好使用不同的工具包和/或不同的操作系统,因为当前的
Robot
的java7实现实际上并没有模拟按键(在Fedora上)。
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_CONTROL);