8

わかりました、これが重複の可能性があるとしてフラグが立てられる前に、私はすでに次のコードを試しました:

Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)

そして、それは常に私にとってfalseを返しています[以下を参照]。これが機能するはずで、私がそれを悪用しているのか、それとも壊れていることがわかっているのか、誰かが確認できますか? それが実際に壊れている場合、誰かが使用するより良い方法を持っていますか?

編集:

わかりました、さらに何かを見つけました。プログラムの起動時の状態を返すようです。オンにしてプログラムを開始すると、オンと表示され、その逆も同様です。これが私のコードです:

while (true) {
    boolean isOn = Toolkit.getDefaultToolkit().getLockingKeyState(
        KeyEvent.VK_CAPS_LOCK);
    System.out.println("Caps lock is now: " + (isOn ? "ON" : "off"));
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
}

そして、それは常にそれが始まったものは何でも印刷するだけです

(例: Caps Lock をオンにして開始すると、すぐにオフに切り替えても、次のように出力されます。

Caps Lock は現在: オン

Caps Lock は現在: オン

Caps Lock は現在: オン

Caps Lock は現在: オン

など、オフから始めると、何があっても印刷されます)

4

3 に答える 3

5

getLockingKeyState()ぶらぶらしてみると、壊れているのではないかと思います。

KeyboardUtilsを試すこともできますが、それは JNA オーバーヘッドを運ぶ必要があることを意味するようです。

于 2012-08-18T18:26:52.823 に答える
1

これは常に壊れていたか、少なくとも Java 1.3 以降のようです ( Bug 4414164を参照)。

他のプラットフォームについてはわかりませんが、Windowsについては次のように言えます。Caps Lock の状態変化は検出できますが、awt クライアントにフォーカスがある場合に限ります。しかし、私のために働くこの回避策があります:

boolean isCapsLockOn() {
    java.awt.Robot robot = new java.awt.Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    return Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);  
}

制約: を呼び出す前に、awt アプリにフォーカスが必要ですisCapsLockOn

注: ロボットは、アプリに害のない他のキーを押す可能性があります。ユースケースに依存する場合があります。

于 2019-01-15T14:44:08.127 に答える