Подтвердить что ты не робот

Ярлык для всей системы Java

Есть ли способ получить общедоступную (глобальную) комбинацию клавиш для выполнить действие в приложении Java?

Любые привязки AWT/Swing?

4b9b3361

Ответ 1

Нет, но в Windows вы можете использовать это:

jintellitype

К сожалению, я ничего не знаю о Linux и OSX, возможно, поэтому он не поставляется с Java из коробки.

Если вы найдете другие платформы, опубликуйте их здесь, пожалуйста :)

Просто ради мужественности, что ты с этим делаешь?

Ответ 2

Я автор JIntellitype, и я могу сказать вам, что это должно быть сделано изначально в DLL и вызвано из Java JNI, как это делает JIntellitype. Это крючок уровня ОС, который не реализован в JDK, поэтому должны использоваться библиотеки, такие как JIntellitype и jxGrabKey. Насколько я знаю, никто еще не написал один для OSX.

JIntellitype является открытым исходным кодом на Github, поэтому, если вы хотите понять, как это работает, просто проверьте source code

Ответ 3

Я только что нашел 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);

Пример кода отсюда

Ответ 4

ОБНОВЛЕНИЕ: я не знаю, можно ли перехватывать события из ВНУТРИ 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
    }
}

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

Ответ 5

Для окон вам понадобится DLL-клавиатура. Вы можете инициализировать вашу dll из java, что приведет к регистрации регистратора. Вы получите то, что вам нужно. Проверьте msdn на крючки dll или перехватчики клавиатуры. Один из них должен вас устроить.

Для linux я думаю, что это должно быть проще, но я никогда не делал этого сам.

http://ubuntuforums.org/showthread.php?t=864566

Первый результат Google для "прослушивания Linux для глобальных нажатий клавиш" (без кавычек) отображает то, что, по-моему, поможет вам в средах X11

OSX может просто использовать решение, близкое к этому. Но, в конце концов, вам, вероятно, понадобится dll для каждой платформы, если только JNA не сможет сделать это без проблем, тогда самое худшее сделано.

Ответ 6

JDIC (интеграция с Java Desktop) может помочь https://jdic.dev.java.net/

Кажется, мне немного не хватало. Я не уверен.
Если кто-то знает больше, пожалуйста, сообщите! Я также очень заинтересован в этой функции.