Есть ли способ получить общедоступную (глобальную) комбинацию клавиш для выполнить действие в приложении Java?
Любые привязки AWT/Swing?
Есть ли способ получить общедоступную (глобальную) комбинацию клавиш для выполнить действие в приложении Java?
Любые привязки AWT/Swing?
Нет, но в Windows вы можете использовать это:
К сожалению, я ничего не знаю о Linux и OSX, возможно, поэтому он не поставляется с Java из коробки.
Если вы найдете другие платформы, опубликуйте их здесь, пожалуйста :)
Просто ради мужественности, что ты с этим делаешь?
Я автор JIntellitype, и я могу сказать вам, что это должно быть сделано изначально в DLL и вызвано из Java JNI, как это делает JIntellitype. Это крючок уровня ОС, который не реализован в JDK, поэтому должны использоваться библиотеки, такие как JIntellitype и jxGrabKey. Насколько я знаю, никто еще не написал один для OSX.
JIntellitype является открытым исходным кодом на Github, поэтому, если вы хотите понять, как это работает, просто проверьте source code
Я только что нашел https://github.com/kwhat/jnativehook
Кажется, кросс-платформенный.
Вот их пример кода для прослушивания нажатий клавиш:
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListenerExample implements NativeKeyListener {
public void nativeKeyPressed(NativeKeyEvent e) {
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
}
}
Проверка на модификаторы основана на битовых масках (вещи, которые мы все должны знать, но всегда забываем: -P):
boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0;
boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0;
Это вы можете комбинировать с KeyCode:
if (e.getKeyCode() == NativeKeyEvent.VK_2 && isShiftPressed && isAltPressed){...}
Это модифицированный пример отсюда
Вы также должны изменить поведение по умолчанию, иначе оно будет спамить консоль:
// Get the logger for "org.jnativehook" and set the level to warning.
Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
logger.setLevel(Level.WARNING);
// Don't forget to disable the parent handlers.
logger.setUseParentHandlers(false);
Пример кода отсюда
ОБНОВЛЕНИЕ: я не знаю, можно ли перехватывать события из ВНУТРИ JVM. Я думаю, что компонент Swing/AWT должен сосредоточиться на этом, чтобы работать.
Вы хотите подключиться к очереди событий Java AWT, чтобы быть абсолютно уверенным, что вы можете получить глобальное (jvm wide) нажатие.
Использование
EventQueue ev = Toolkit.getSystemEventQueue();
// MyCustomEventQueue extends EventQueue and processes keyboard events in the dispatch
ev.push(new MyCustomEventQueue());
class MyEventQueue extends EventQueue
{
protected void dispatchEvent(AWTEvent event)
{
// all AWTEvents can be indentified by type, KeyEvent, MouseEvent, etc
// look for KeyEvents and match against you hotkeys / callbacks
}
}
Я думаю, что могут быть другие способы достижения глобальных нажатий клавиш с картами действий. Я действительно использовал приведенный выше метр
Для окон вам понадобится DLL-клавиатура. Вы можете инициализировать вашу dll из java, что приведет к регистрации регистратора. Вы получите то, что вам нужно. Проверьте msdn на крючки dll или перехватчики клавиатуры. Один из них должен вас устроить.
Для linux я думаю, что это должно быть проще, но я никогда не делал этого сам.
http://ubuntuforums.org/showthread.php?t=864566
Первый результат Google для "прослушивания Linux для глобальных нажатий клавиш" (без кавычек) отображает то, что, по-моему, поможет вам в средах X11
OSX может просто использовать решение, близкое к этому. Но, в конце концов, вам, вероятно, понадобится dll для каждой платформы, если только JNA не сможет сделать это без проблем, тогда самое худшее сделано.
JDIC (интеграция с Java Desktop) может помочь https://jdic.dev.java.net/
Кажется, мне немного не хватало. Я не уверен.
Если кто-то знает больше, пожалуйста, сообщите!
Я также очень заинтересован в этой функции.