2008-10-02 2 views
7

Я пытаюсь написать диалог выбора разрешения, который появляется, когда программа запускается впервые. Чтобы избежать скучного пользователя, я хочу реализовать довольно стандартную функцию, с помощью которой вы можете отключить это диалоговое окно, но верните его, удерживая клавишу alt при запуске.Как проверить, что ключ удерживается при запуске в Java

К сожалению, нет очевидного способа спросить java, находится ли данный ключ в настоящее время . Вы можете зарегистрироваться только для получения информации о новых нажатиях клавиш с помощью KeyListener, но это не помогает, если запуск нажатия клавиши начинается до запуска приложения.

ответ

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

Я мало знаю о Java (в основном код на C#), но как насчет наличия небольшой программы-загрузчика, написанной на C или чего-то, что затем запускает ваше Java-приложение с некоторыми параметрами (например, независимо от того,)?

+0

Трудное решение в том, что программа хочет работать на Mac/Windows/Linux, и что у меня достаточно C. – Zarkonnen 2008-10-02 00:18:57

+0

не знаю @Zarkonnen У этого есть JVM в комплекте с установщиком? Если да, то `KeyboadUtils.isPressed` будет работать на Windows, Mac и Linux – AlexV 2012-07-29 23:56:23

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

Существует два типа обнаружения нажатия клавиш: событие и опрос. Если вы опросете клавиатуру для KEY_PRESSED при запуске (через цикл с sleep.thread(timeInMs), постоянно проверяющий, не выключен ли ваш ключ), вы можете определить, уже ли он нажат при запуске.

0

Таким образом, похоже, что вы можете это сделать, но только для caps lock и др. Следовательно, для этой цели я переключился на использование кеш-замка. Не идеально, но хорошо.

1

Оригинальный вопрос, кажется, не ответил. Предлагаемый метод определяет состояние блокирующего ключа, например CapsLock, ScrollLock и т. Д. Таким образом, это не сработало бы при нажатии Alt.

Рассмотрим следующий код:

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

Единственная проблема заключается в том, что этот класс является внутренним JDK класса Sun и не могут быть доступны в любой другой виртуальной машины Java. В зависимости от вашего проекта это может быть или не быть приемлемым.

Внутренне он вызывает в USER32.dll на Windows:

User32.INSTANCE.GetAsyncKeyState(...)

Смежные вопросы