Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11

Глобальный захват нажатий клавиш - WinAPI, JNA

04.08.2013, 16:30. Показов 5857. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пишу голосовой чат на Java с использованием JNA, и вот уже работа подходит к концу, но я до сих пор не решил одну проблему с глобальным захватом нажатий клавиш клавиатуры в Windows. В то время когда зажата определённая клавиша, программа должна передавать звук.
Сначала попробовал зарегистрировать горячую клавишу с помощью RegisterHotKey(...), но это позволяет лишь отловить сообщение WM_HOTKEY, мне этого недостаточно. Мне же нужно знать когда была нажата и отпущена клавиша.
Затем поставил Хук на клавиатуру и мне удалось отследить нажатия и отпускания клавиш. Но клавиатура блокируется для других программ, в том числе не работают любые горячие клавиши Windows.
Вот как я это сделал(точнее это уже было сделано за меня):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.WinUser.MSG;
 
/** Sample implementation of a low-level keyboard hook on W32. */
public class KeyHook {
    private static volatile boolean quit;
    private static HHOOK hhk;
    private static LowLevelKeyboardProc keyboardHook;
 
    public static void main(String[] args) {
        final User32 lib = User32.INSTANCE;
        HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
        keyboardHook = new LowLevelKeyboardProc() {
            public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
                if (nCode >= 0) {
                    switch(wParam.intValue()) {
                    case WinUser.WM_KEYUP:
                        switch(info.vkCode){
                            case 0x71:
                                System.out.println("F2_UP");
                                break;
 
                            case 0x1B:
                                quit = true;
                                break;
                        }
                        break;
                    case WinUser.WM_KEYDOWN:
                        switch(info.vkCode){
                            case 0x71:
                                System.out.println("F2_DOWN");
                                break;
                        }
                        break;
                    case WinUser.WM_SYSKEYUP:
                        break;
                    case WinUser.WM_SYSKEYDOWN:
                        break;
                        
                    }
                }
                return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
            }
        };
        hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
        System.out.println("Keyboard hook installed, type anywhere, 'q' to quit");
        new Thread() {
            public void run() {
                while (!quit) {
                    try { Thread.sleep(10); } catch(Exception e) { }
                }
                System.err.println("unhook and exit");
                lib.UnhookWindowsHookEx(hhk);
                System.exit(0);
            }
        }.start();
 
        // This bit never returns from GetMessage
        int result;
        MSG msg = new MSG();
        while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
            if (result == -1) {
                System.err.println("error in get message");
                break;
            }
            else {
                System.err.println("got message");
                lib.TranslateMessage(msg);
                lib.DispatchMessage(msg);
            }
        }
        lib.UnhookWindowsHookEx(hhk);
    }
}
Так как же не блокируя клавиатуру для других программ, глобально перехватить нажатия(отпускания) клавиш?
Поделитесь пожалуйста опытом.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.08.2013, 16:30
Ответы с готовыми решениями:

JNA и потоки WinAPI
Здравствуйте. В общем, столкнулся с такой проблемой. По заданию нужно получить структуру CONTEXT потока. Как я понимаю, то поток этот с...

Глобальный перехват нажатий клавиш
Как сделать перехват клавиш вне своей программы?

Silverlight. Глобальный перехват нажатий клавиш
Нужно перехватывать нажатия клавиш и отменять стандартное поведение в елементах управления. Например если фокус находится на елементе...

1
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
07.08.2013, 14:42  [ТС]
Проблема решилась сама собой, всё дело было в значении возвращаемым функцией callback.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2013, 14:42
Помогаю со студенческими работами здесь

Глобальный перехват нажатий клавиш в системе
Потребовалось узнать нажатия клавиши при минимизированной программе. Хочу регулировать кнопками "+", "-" общую ...

Глобальный перехват нажатий клавиш в системе
Всем доброго вечера. Хотелось реализовать программу которая будет при нажатии скажем Pause/Break? открывает Form2, пробовал так ...

Нажатие клавиш вне формы (глобальный перехват сочетания клавиш)
Всем доброго времени суток! Задумал сделать значок раскладки клавы, но беда в том, что если потерян фокус приложения, то значок не...

Глобальный перехват нажатий
Нужно перехватывать нажатия тогда когда на форме нет фокуса. Я даже когда он есть на ней не могу ничего перехватить. Это вообще возможно?

Глобальный перехват нажатий клавиатуры
Ребят нужен код на глобальный перехват нажатий на клавиатуре Мне не надо перехват с мышки а только с клавиатуры и только одной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru