4

我多次使用 Robot 类,但在 Windows 中我没有遇到任何问题。但这次我使用的是 Fedora,如果我尝试

keyPress(KeyEvent.VK_WINDOWS)它不工作。

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

PS:我什至尝试过Event.META_MASK但没有运气

4

2 回答 2

-1

使用此问题的第一个答案的编辑版本:

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class Sample implements KeyListener {
    private JLabel label = new JLabel("Hello");
    private JPanel panel = new JPanel(new BorderLayout());
    private JFrame frame = new JFrame("Sample");

    public Sample() {
        panel.add("North", label);
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
        panel.addKeyListener(this);
        frame.addKeyListener(this);
        label.addKeyListener(this);
        pnl.setVisible(true);

    }

    public static void main(String[] args) {
        new Sample();
    }

    @Override
    public void keyPressed(KeyEvent key) {
        System.out.println(key.getExtendedKeyCode());
        System.out.println(key.getKeyCode());
        System.out.println(key.getModifiers());
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

您可以KeyEvent使用此程序检查任何键的键码。对我来说(Fedora 19 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);

    }

}

按下meta+zkonsole没有触发我的系统运行快捷方式。Robot

我猜是 AWT,或者Robot它本身以某种方式错误地处理了密钥。也许 Java 还没有达到 Linux 中Windows键的使用标准——例如在 Gnome Shell 键盘快捷键中。

我个人会尽量不使用它,或者尝试不同的框架,fe Eclipse SWT。

尝试RobotTest使用 OpenJDK 运行并没有产生更好的结果。

于 2013-09-23T19:17:06.447 回答
-1
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

于 2017-12-25T21:41:17.767 回答