2014-12-30 11 views
5

Korzystanie poniższy kod:Odzyskiwanie aktualny stan CapsLock w Javie

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

Niestety, tylko zwraca false.

Zgodnie docs, to powinno działać: http://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html#getLockingKeyState-int-

Runnable przykład:

import java.awt.Toolkit; 
import java.awt.event.KeyEvent; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 


public class Foo { 

    public static void main(String[] args) { 

     ExecutorService executorService = Executors.newFixedThreadPool(1); 

     executorService.execute(new Runnable() { 
      public void run() { 
       while(true) { 
        try{ Thread.sleep(250); }catch(Exception ignored) { } 
        System.out.println("Capslock state: " + Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
       } 
      } 
     }); 

     executorService.shutdown(); 
    } 

} 

Należy dodać, że używam Java SE 1.8 na Windows i że mój klucz Caplock działa dobrze

Zrzut ekranu wyjścia konsoli:

enter image description here

+0

Jest [raport bug] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4414164) w tej sprawie, który wyjaśnia, że ​​w systemie Windows, gdy aplikacja ma ramkę ze skupieniem, ta metoda zadziała; w przeciwnym razie zwróci tylko tę wartość, która była podczas wykonywania programu. – Vulcan

+0

@Vulcan, w tym przypadku jest to niepoprawne - ponieważ zwraca błąd, niezależnie od stanu początkowego. To również nie odpowiada na pytanie, ponieważ (isPressed) z JNA KeyUtils nie jest rozwiązaniem do sprawdzania zablokowanego klucza. – Hobbyist

Odpowiedz

2

Twój kod działa dobrze dla mnie. Właśnie wyciąłem twój kod, skompilowałem go, uruchomiłem i kliknąłem blokadę caps podczas działania. Oto wynik:

$ javac Foo.java 
$ java Foo 
Capslock state: false 
Capslock state: false 
Capslock state: false 
Capslock state: false 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: false 
Capslock state: false 
Capslock state: false 
^C 

Używam java 8, jak ty.

$ java -version 
java version "1.8.0_25" 
Java(TM) SE Runtime Environment (build 1.8.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 

Czy Twój klucz blokady caps działa?

+0

'java -version wersja java" 1.8.0_11 " Java Runtime Environment (kompilacja 1.8.0_11-b12) 64-bitowa maszyna wirtualna Java HotSpot (kompilacja 25.11-b03, tryb mieszany)' I mój klucz blokady caps działa dobrze, dla mnie wartość zawsze zwraca false. – Hobbyist

+0

Zoptymalizowano wyniki dla formatowania: http://gyazo.com/a48e29dd4ab1f98e4e76e94e791bd684 – Hobbyist

+0

Nie mam dokładnej wersji java w moim systemie, próbowałem z nieco starszym 'jdk1.8.0_05', który w moim systemie działał jako dobrze. – Asaph

0

Twój kod działa poprawnie na java 1.7.0_25 i 6. Po prostu skopiuj go i uruchom, używając netbeans.

Oto wynik

Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
Capslock state: true 
pslock state: true 
Capslock state: true 

To powinno działać na Java 8 próbowałeś za pomocą IDE?

używam Windows 7.

+0

Używam eclipse; Jednak uruchomiłem go w CMD tylko po to, aby dwukrotnie sprawdzić. – Hobbyist

+0

wypróbowałeś jakiś inny klucz oprócz Capslocka? Tylko do testowania –

Powiązane problemy