2008-10-02 15 views
7

Ich versuche, einen Auflösungsauswahldialog zu schreiben, der erscheint, wenn ein Programm zum ersten Mal gestartet wird. Um zu verhindern, dass der Benutzer langweilig wird, möchte ich das ziemlich standardmäßige Feature implementieren, dass Sie diesen Dialog mit einem Kontrollkästchen deaktivieren können, aber es zurückbekommen, indem Sie beim Start die Alt-Taste gedrückt halten.So überprüfen Sie, ob die Taste beim Start in Java gedrückt wird

Leider gibt es keine offensichtliche Möglichkeit, Java zu fragen, ob eine bestimmte Taste gerade gedrückt wird. Sie können sich nur registrieren, um über neue Tastenbetätigungen über einen KeyListener informiert zu werden, aber das hilft nicht, wenn der Tastendruck startet, bevor die App startet.

Antwort

1
public class LockingKeyDemo { 
    static Toolkit kit = Toolkit.getDefaultToolkit(); 

    public static void main(String[] args) { 
     System.out.println("caps lock2 = " 
       + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
} 
} 
+0

Woher soll ich die Toolkit-Klasse importieren? –

+0

hat diese Lösung die in diesem Blogpost beschriebenen Probleme überwunden? Es beschreibt diese Methode als unzuverlässig, aber es ist alt .... http://weblogs.java.net/blog/2007/11/02/log-me-log-me-out – slothbear

0

Ich weiß nicht viel über Java (meistens Code in C#), aber was ist mit einem kleinen Ladeprogramm in C geschrieben oder etwas, das dann Ihre Java-App mit einigen Parametern startet (zB ob ein bestimmter Schlüssel ausgefallen ist oder nicht))

+0

Eine schwierige Lösung, dass das Programm möchte auf Mac/Windows/Linux laufen zu lassen, und dass ich weiß nicht genug C. – Zarkonnen

+0

@Zarkonnen Hat es JVM mit dem Installer gebündelt? Wenn die Antwort ja ist, dann würde das 'KeyboadUtils.isPressed' unter Windows, Mac und Linux funktionieren. – AlexV

4
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JFrame; 

public class LockingKeyDemo { 
    static Toolkit kit = Toolkit.getDefaultToolkit(); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     frame.addWindowListener(new WindowAdapter() { 
      public void windowActivated(WindowEvent e) { 
       System.out.println("caps lock1 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 

       try { 
        Robot robot = new Robot(); 
        robot.keyPress(KeyEvent.VK_CONTROL); 
        robot.keyRelease(KeyEvent.VK_CONTROL); 
       } catch (Exception e2) { 
        System.out.println(e2); 
       } 

       System.out.println("caps lock2 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
      } 
     }); 

     frame.addKeyListener(new KeyAdapter() { 
      public void keyReleased(KeyEvent e) { 
       System.out.println("caps lock3 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
      } 
     }); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
2

Nun gibt es zwei Arten der Tastendruckerkennung: ereignisbasiert und zyklisch. Wenn Sie die Tastatur für KEY_PRESSED beim Start abfragen (durch eine Schleife mit einer sleep.thread(timeInMs) ständig überprüft, ob Ihr Schlüssel nicht aktiv ist), können Sie erkennen, ob es bereits beim Start gedrückt wird.

0

So scheint es, dass Sie dies tun können, aber nur für Caps Lock et al. Daher habe ich zu diesem Zweck die Verwendung der Feststelltaste aktiviert. Nicht perfekt, aber OK.

1

Die ursprüngliche Frage scheint nicht beantwortet zu werden. Die vorgeschlagene Methode bestimmt den Sperrzustand wie CapsLock, ScrollLock, usw. Es würde also nicht für Alt gedrückt werden.

Betrachten Sie den folgenden Code ein:

com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);

Das einzige Problem ist, dass diese Klasse eine interne Suns JDK-Klasse ist und wahrscheinlich nicht in jedem anderen JVM zur Verfügung steht. Abhängig von Ihrem Projekt kann es akzeptabel sein oder auch nicht.

Intern ruft es in User32.DLL unter Windows:

User32.INSTANCE.GetAsyncKeyState(...)