Как проверить, удерживается ли ключ при запуске в Java

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

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


person Zarkonnen    schedule 02.10.2008    source источник


Ответы (5)


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

person Karan    schedule 02.10.2008

Исходный вопрос, кажется, не ответил. Предлагаемый метод определяет состояние клавиши блокировки, такое как CapsLock, ScrollLock и т. д. Таким образом, он не будет работать для нажатого состояния Alt.

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

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

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

Внутри он вызывает User32.DLL в Windows:

User32.INSTANCE.GetAsyncKeyState(...)

person AlexV    schedule 29.07.2012

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

person Rodrick Chapman    schedule 02.10.2008
comment
Сложное решение в том, что программа хочет работать на Mac/Windows/Linux, а я недостаточно знаю C. - person Zarkonnen; 02.10.2008
comment
@Zarkonnen Есть ли JVM в комплекте с установщиком? Если ответ да, то KeyboadUtils.isPressed будет работать на Windows, Mac и Linux. - person AlexV; 30.07.2012

Похоже, вы можете это сделать, но только для Caps Lock и др. Следовательно, я переключился на использование Caps Lock для этой цели. Не идеально, но нормально.

person Zarkonnen    schedule 03.10.2008

person    schedule
comment
откуда мне импортировать класс Toolkit? - person Amir Arad; 05.10.2008
comment
Преодолело ли это решение проблемы, описанные в этом сообщении в блоге? Он как бы описывает этот метод как ненадежный, но он устарел.... weblogs.java.net/blog/2007/11/02/log-me-log-me-out - person slothbear; 02.11.2009