2

我正在编写一个应用程序,它应该在启动时检查是否按下了 shift 键。为此,我创建了一个负责此的小类:

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;

public class KeyboardListener {

    private static boolean isShiftDown;

    static {
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
            new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(KeyEvent e) {
                    isShiftDown = e.isShiftDown();
                    return false;
                }
            });
    }

    public static boolean isShiftDown() {
        return isShiftDown;
    }

}

但是,如果在应用程序启动时已经按下了 shift 键,这似乎不起作用。以下检查始终执行 else 情况。

if (KeyboardListener.isShiftDown()) {
    // ...
} else {
    // this always gets executed
}

如果在应用程序启动时已经按下了 shift 键,有没有办法检查它是否被按下?我知道使用 WinAPI 可以做到这一点,但我更喜欢 Javaish 的方式。

提前致谢!

4

3 回答 3

1

我将其描述为 hack,但它确实解决了问题(有一些缺点),所以我想我会提到它作为一种可能性。

您可以使用Robot该类来模拟您的应用程序不关心的某个键的击键(可能是功能键之一)。注册后立即运行此代码KeyListener。您将看到一个关键事件,它会告诉您是否Shift已关闭。

警告:这将出现在系统中,就好像F24用户实际按下和释放了(或您选择的任何键)。这可能会产生意想不到的副作用。

    (new Thread( )
    {
        @Override
        public void run( )
        {
            try
            {
                java.awt.Robot robot = new Robot();
                robot.delay( 100 );
                robot.keyPress( KeyEvent.VK_F24 );
                robot.keyRelease( KeyEvent.VK_F24 );
            }
            catch ( Exception e )
            {
            }
        }
    }).start( );
于 2012-04-08T16:44:05.060 回答
1

这似乎是不可能的,因为它要求应用程序轮询初始状态,这与 AWT/Swing 使用的事件模型相反。

于 2012-04-08T16:25:19.073 回答
1

清理您的编码风格可能会有所帮助,我发现您的代码难以阅读。

您的程序可能不会侦听在程序按设计启动之前发生的转变,因为这种转变是发送给父程序而不是发送给它的。

于 2012-04-08T16:25:29.153 回答