У меня есть план создания программы на Java, работающей под Windows, которая может отображать разные «макросы» на разные клавиши, работающие в фоновом режиме. Проблема в том, как заставить Java слушать нажатия клавиш, когда приложение не сфокусировано.
Я нашел много мнений, что это невозможно. Но я также нашел это, написанное Стефано здесь, на SO . Это решение для меня недостаточно хорошее, по крайней мере, нет одной важной информации. Функция MsgWaitForMultipleObjects()
возвращает одно значение, если клавиша не нажата... это нормально. После нажатия клавиши она возвращает другое значение... это было бы нормально, если бы функция не возвращала одно и то же значение, что бы ни происходило после события нажатия клавиши.
Вот поток тестирования этого:
public class KeyListener extends Thread {
/**
* Constructor
*/
public KeyListener() {
super();
}
/**
* RUN method
*/
@Override
public void run() {
int x;
User32 user32 = User32.INSTANCE;
boolean res = user32.RegisterHotKey(Pointer.NULL, 1, User32.MOD_ALT | User32.MOD_CONTROL, WinKeys.VK_X);
if (!res) {
System.out.println("Couldn't register hotkey");
}
System.out.println("Starting and waiting");
while (!isInterrupted()) {
x = user32.MsgWaitForMultipleObjects(0, Pointer.NULL, true, 1000, User32.QS_HOTKEY);
if (x == 0) {
System.out.println("Key pressed");
}
}
}
}
Эта маленькая программа (использующая этот поток) реагирует на нажатие ALT+X
. После этого на консоль выводится текст Key pressed
до остановки программы (функция все время возвращает 0). Возможным решением, на мой взгляд, является некоторый «сброс» функции, поэтому она будет ждать повторного нажатия клавиши и снова возвращать 258
(258
== ожидание). Но я понятия не имею, как это сделать.
Если кто-то знает, как это сделать, или есть другое решение, буду признателен за любую информацию.