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キーがすでに押されていた場合に、Shiftキーが押されているかどうかを確認する方法はありますか?WinAPIを使用してこれが可能であることは知っていますが、Java風の方法を使用したいと思います。

前もって感謝します!

4

3 に答える 3

1

AWT / Swingで使用されるイベントのモデルとは対照的に、アプリケーションが初期ステータスをポーリングする必要があるため、これは不可能と思われます。

于 2012-04-08T16:25:19.073 に答える
1

コーディングスタイルをクリーンアップすると役立つ場合がありますが、コードが読みにくいと思います。

このシフトは親プログラムではなく親プログラムに送信されたため、プログラムが設計によって開始される前に発生したシフトをプログラムがリッスンしていない可能性があります。

于 2012-04-08T16:25:29.153 に答える
1

私はこれをハックとして特徴付けますが、それは問題を解決します(いくつかの欠点があります)ので、私はそれを可能性として言及すると思いました。

このRobotクラスを使用して、アプリケーションが気にしないキー(おそらくファンクションキーの1つ)のキーストロークをシミュレートできます。を登録した直後にこのコードを実行します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 に答える