![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Iamme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.7.2009 Репутация: нет Всего: нет |
Добрый день!
Мы вообще то пишем на java, но программа должна выполнять действия по комбинации клавиш (на java не реализуемо), в связи с этим я пытаюсь пока написать простейший код на С++ с использованием WinApi, который выводит сообщение по нажатию клавиши (пока любой). Получилось вот что:
Сообщение вроде выводится по нажатию любой кнопки в любом окне, но сразу же возникает исключение "ошибка чтения" Подскажите, в чем дело? Также буду благодарна, если мне подскажут, как перехватывать не любую клавишу, а комбинацию Ctrl+C+C. Спасибо. Использую среду Visual C++. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
у KeyboardProc соглашение вызова должно быть stdcall
поправь так:
Добавлено через 3 минуты и 58 секунд три клавиши... вообще, на 3 разные клавиши можно обойтись GetKeyState но раз некоторые повторяются, причем в определенной последовательности, то можно завести стек последних трех клавиш (вернее очередь) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
jonie |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
1.
2.
проверить на "ctrl" нажата можно так:
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||
|
|||||||
Iamme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.7.2009 Репутация: нет Всего: нет |
решение с перехватом пока такое
Вроде перехватывает по 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 |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
т.е. wParam будет просто одним из сообщением (DWORD-ом, DWORD это типа беззнаковое целое размером в 32бита на x86 системе). Вам еще нужно не забыть что остановка хуков нужна! Вы обязаны сделать UnhookWindowsHookEx(hHook) после того как вам хук не нужен будет в противном случае возможно вы будете являться причиной деградирования системы... Скорее всего вас устроит длл (или COM) которая будет содержать функции установки хука, его снятия. При установке создаст глобальный объект синхронизации, например Mutex, и в цикле обработки сообщений сделаете проверку на состояние мьютекса... В общем-то у меня есть готовая длл-ка, на assembler x86 правда (впрочем не особо суть разница), реализующая не низкоуровневые, а обычные хуки, параметром которой является HWND (хендл окна). Если Java умеет обрабатывать оконные сообщения то мб вам она подойдет... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||||
|
|||||||||||
Iamme |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.7.2009 Репутация: нет Всего: нет |
Делаю DLL, так и планирую - 2 метода - установки (start) и снятия (stop) хука.
Для начала пытаюсь эту dll из с++ вызвать, два метода подряд для теста , вот вызов
Но адреса start и stop почему-то нулевые получаются. В чем может быть причина? PS И зачем еще поток Mutex создавать? |
||||||
|
|||||||
jonie |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
Включите в длл файд def примерно такого содержимого:
и уберите __declspec(dllexport) Также пропишите в опциях компилятора (в нстройках есть) Module Definition File на только что добавленый def файл.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||
|
|||||||
Iamme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.7.2009 Репутация: нет Всего: нет |
А что значит "неблокирующий потокобезопасный start и stop"? Можно командами? все это нужно для создания процесса? (в данный момент при использованиии Dll цикл сообщений сразу заканчивается, никакого ожидания нажатий не происходит) |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
Присоединённый файл ( Кол-во скачиваний: 32 ) ![]() -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |