| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Как перехватить нажатие клавиши |
| Автор: Iamme 1.7.2009, 20:01 | ||
| Добрый день! Мы вообще то пишем на java, но программа должна выполнять действия по комбинации клавиш (на java не реализуемо), в связи с этим я пытаюсь пока написать простейший код на С++ с использованием WinApi, который выводит сообщение по нажатию клавиши (пока любой). Получилось вот что:
Сообщение вроде выводится по нажатию любой кнопки в любом окне, но сразу же возникает исключение "ошибка чтения" Подскажите, в чем дело? Также буду благодарна, если мне подскажут, как перехватывать не любую клавишу, а комбинацию Ctrl+C+C. Спасибо. Использую среду Visual C++. |
| Автор: GremlinProg 1.7.2009, 20:06 | ||
| у KeyboardProc соглашение вызова должно быть stdcall поправь так:
Добавлено через 3 минуты и 58 секунд три клавиши... вообще, на 3 разные клавиши можно обойтись GetKeyState но раз некоторые повторяются, причем в определенной последовательности, то можно завести стек последних трех клавиш (вернее очередь) |
| Автор: jonie 1.7.2009, 20:34 | ||||||
1.
2.
проверить на "ctrl" нажата можно так:
|
| Автор: Iamme 3.7.2009, 16:24 | ||
решение с перехватом пока такое
Вроде перехватывает по Ctrl CC, но мне непонятно следующее 1)в документации сказано, что wPAram содержит код виртуальной клавиши. Сколько раз не жмешь кнопку, значение wParam не меняется (WM_KEYDOWN), а код реально брать вот так надо KBDLLHOOKSTRUCT * p = (KBDLLHOOKSTRUCT*)lParam; p->vkCode Почему wParam не меняется? вроде код написала, но так и не поняла пока 2) Почему мне написали return CallNextHookEx(hhk, nCode, wParam, lParam); а не return 0? 3) dll теперь надо |
| Автор: jonie 3.7.2009, 20:17 | ||||||||||
т.е. wParam будет просто одним из сообщением (DWORD-ом, DWORD это типа беззнаковое целое размером в 32бита на x86 системе). Вам еще нужно не забыть что остановка хуков нужна! Вы обязаны сделать UnhookWindowsHookEx(hHook) после того как вам хук не нужен будет в противном случае возможно вы будете являться причиной деградирования системы... Скорее всего вас устроит длл (или COM) которая будет содержать функции установки хука, его снятия. При установке создаст глобальный объект синхронизации, например Mutex, и в цикле обработки сообщений сделаете проверку на состояние мьютекса... В общем-то у меня есть готовая длл-ка, на assembler x86 правда (впрочем не особо суть разница), реализующая не низкоуровневые, а обычные хуки, параметром которой является HWND (хендл окна). Если Java умеет обрабатывать оконные сообщения то мб вам она подойдет... |
| Автор: Iamme 3.7.2009, 22:07 | ||||||
Делаю DLL, так и планирую - 2 метода - установки (start) и снятия (stop) хука.
Для начала пытаюсь эту dll из с++ вызвать, два метода подряд для теста , вот вызов
Но адреса start и stop почему-то нулевые получаются. В чем может быть причина? PS И зачем еще поток Mutex создавать? |
| Автор: jonie 4.7.2009, 07:58 | ||||||
Включите в длл файд def примерно такого содержимого:
и уберите __declspec(dllexport) Также пропишите в опциях компилятора (в нстройках есть) Module Definition File на только что добавленый def файл.
|
| Автор: Iamme 12.7.2009, 09:23 | ||
А что значит "неблокирующий потокобезопасный start и stop"? Можно командами? все это нужно для создания процесса? (в данный момент при использованиии Dll цикл сообщений сразу заканчивается, никакого ожидания нажатий не происходит) |
| Автор: jonie 12.7.2009, 11:34 | ||
|