| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Перехват клавиатуры |
| Автор: Cristall512 8.1.2011, 19:03 | ||||
Нужно написать невидимую программу, реагирующую на горячие клавиши. По-моему, это делается с помощью перехвата клавиатуры. Вот фрагмент кода:
А вот фрагмент из DLL (чисто для теста):
Программа должна реагировать на нажатие SHIFT, но этого не происходит. Где ошибка? Да, ещё: если поставить вызов блокнота в тело KeyboardProc, тоже ничего не происходит, то есть программа вообще не реагирует на события клавиатуры |
| Автор: Cristall512 8.1.2011, 19:48 | ||
Добавил кое-что:
Теперь блокнот всё равно не вызывается, то есть SetWindowsHookEx не работает... почему? У меня Win7 64 |
| Автор: bra1ny 8.1.2011, 20:15 | ||
советую Вам мое более красивое решение. http://wasm.ru/article.php?article=gui_subsystem + не все комбинации легальными способами можно перехватить , в операционной системе защита стоит . |
| Автор: Cristall512 8.1.2011, 21:36 |
| "Хочется отметить, что в Висте механизм регистрации горячих клавиш немного изменен" в семёрке, наверное, тоже. у меня семёрка |
| Автор: bra1ny 8.1.2011, 21:52 |
| изменен тем , что там не список хоткеев а хэш таблица. |
| Автор: Dem_max 9.1.2011, 10:22 | ||||
Красивое решение это делать на ассемблере ? нет уж спасибо.
Какие например нельзя перехватить ???? Чето не припомню. Но точно знаю что просто так не перехватишь кнопку Sleep ибо ее раньше всего перехватит винда, а нажатие в систему не выдаст. Перехватить можно если поставить свой драйвер. 2 Cristall512 Вот почитай что попроще. http://www.xakep.ru/post/29476/default.asp?print=true |
| Автор: Cristall512 9.1.2011, 11:58 | ||||||||
непонимаю... как там обошлись без длл?
.................
где и как они вызываются, я так и не понял. где SetWindowsHookEx? как они обошлись без этой функции? и помогите мне, пожалуйста, найти ошибку в МОЁМ коде... вот новая длл:
я выяснил, что в основной программе возможно получить адрес ф-ции mykey, но невозможно получить адрес KeyboardProc. Может, в dll функцию типа LRESULT CALLBACK надо описывать как-то по-другому? при наведении курсора мыши на CALLBACK всплывает подсказка #define CALLBACK __stdcall, но у меня стоит соглашение __cdecl. При соглашении __stdcall тоже не работает |
| Автор: Cristall512 9.1.2011, 12:18 |
| убрал CALLBACK, заработало, но функция вызывается только один раз... как изменить код, оставив CALLBACK? |
| Автор: Cristall512 9.1.2011, 12:43 |
| проблема решена. с модификатором callback к имени функции при компиляции добавляется префикс _ и постфикс @12 |
| Автор: Cristall512 9.1.2011, 13:27 | ||||
так... ещё проблема. вот код:
почему-то при нажатии клавиш при активном окне какого-либо приложения вызывается несколько блокнотов, а должен один. При активном окне каталога или калькулятора (и, наверное, много ещё чего) блокнот не вызывается вообще, а окно перестаёт реагировать на нажатия мыши |
| Автор: bra1ny 9.1.2011, 14:33 | ||||
Так на си написано же.
crtl+alt+del. |