| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Hook, клава |
| Автор: OXOTHUK 10.8.2006, 10:25 |
| Я тут делаю Jokewar`ную прогу через Hook`и для клавиатуры. Я считываю состояние клавиш через GetKeyboardState. Мне нужно определённую кнопку "подменить" другой, например пользователь нажал "ч", а нажалось "ш". Как это можно организовать? Может лучше использовать что-то другое, а не GetKeyboardState. Видел, что-то похожее на дельфе, они там получали HWND через lParam(в функции хуков 3 параметра int, lparam, wparam) так: TMsg(Pointer(lParam)^).hwnd, как так сделать в MSVS я не знаю. Пробывал читать GetKeyboardState, а вписывать через SetKeyboardState, но ничего не получилось. |
| Автор: _hunter 10.8.2006, 10:48 |
| веашй обычный хук (WH_KEYBOARD). и в его обработчике просто меняй wParam (virtual-key code) Добавлено @ 10:50 http://www.realcoding.net/article/view/182 |
| Автор: OXOTHUK 10.8.2006, 15:58 |
| Я менял, но мои изменения не сохраняются, т. е. продолжает печататься то что нажал. Я проверки вывожу мессагбоксом, там меняется, а в окошке не печатается. Как буд-то на wParam стоит const. Есть ещё методы? |
| Автор: _hunter 10.8.2006, 16:32 |
| ты цепочку продолжаеш? в любом случае -- показывай код |
| Автор: 0x07L 10.8.2006, 16:38 |
| Делал такую прогу месяц назад. Успешно. |
| Автор: Sheff 10.8.2006, 20:35 |
| OXOTHUK, делал похожую прогу с подменой ввода мышки, с клавой аналогично, если нужно могу выслать сорс, пиши в асю 135394514. |
| Автор: OXOTHUK 11.8.2006, 09:29 | ||
Вот мой код(dll):
|
| Автор: _hunter 11.8.2006, 10:24 |
| что-то я не заметил в коде изменения wParam... |
| Автор: Sheff 11.8.2006, 11:48 |
| OXOTHUK, ты изменил локальную переменную wParam не более и вообще лучше по другому сделать, подавлять ввод вообще, а вместо него посылать свой при помощи SendInput. |
| Автор: OXOTHUK 11.8.2006, 15:47 |
| Sheff, А как подавить? И напишите примерчик на SendInput(никогда не имел дела), plz. |
| Автор: 0x07L 11.8.2006, 18:17 | ||
Знаю, что просили не меня, но все же:
1) Есть загвоздка: то, что мы шлем с помощью SendInput, тоже обрабатывается хуком. Для этого придумано спец. значение 666. 2) KeyStruct - это просто структура, которая может хранить скан-код и флажок Extended, а также два специальных значения. Одно из них я использую, если клавиша должна быть удалена, а не замещена. 3) KeyConfigMap - это тип (объявлен через typedef) std::map с нужными мне аргументами шаблона 4) KeyConfig - это глобальный объект типа KeyConfigMap, где хранится конфигурация - пары клавиш [клавиша, кот. заменить] - [клавиша, на кот. заменить] Как я уже сказал, вторая клавиша может иметь специальное значение (удалить). Каждый раз мы ищем нажатую клавишу в этой конфигурации 5) Еще загвоздка. Если нажат Alt - мы "отпускаем" его, посылая key up. Без этого будут глюки. Alt - вредная клавиша. С Ctrl и Shift все нормально. Если чего-то еще непонятно, спрашивай. Надеюсь, ты найдешь для себя здесь что-то полезное. Добавлено @ 18:19 Чуть не забыл: MapVirtualKey - это полезная стандартная функция. |
| Автор: Sheff 11.8.2006, 18:23 | ||
Добавлено @ 18:26 OXOTHUK, похоже тебе уже всё написали добрые люди |
| Автор: 0x07L 12.8.2006, 08:15 |
| Кстати, это функция хука WH_KEYBOARD_LL |
| Автор: OXOTHUK 12.8.2006, 11:42 |
| 0x07L, А где объявлены(или описаны типы): DeleteKey KeyStruct SpecialKey Running KeyConfigMap? Где можно подменить клавишу? (а то тут стоко всего) И у меня при компиляции, те переменные, которые объявлены в winuser.h(даже если он включен) говорит что андекларед инедтифаер. Глюк, что ли? |
| Автор: 0x07L 12.8.2006, 12:10 | ||
Это все мое
Виртуальные коды клавиш смотри в MSDN на страничке "Virtual-Key Codes". Код набирал здесь, поэтому за его работоспособность не ручаюсь. Еще. Я не тестил это на клавиатурах с медиа-клавишами (нет такой клавиатуры в наличии). |
| Автор: OXOTHUK 12.8.2006, 17:08 |
| 0x07L, болшое спасибо! Плюсик поставить не могу, постов не хватает Думаю, тему можно закрывать. |
| Автор: Romikgy 12.8.2006, 18:34 |
| OXOTHUK, уже поставил |
| Автор: 0x07L 12.8.2006, 19:45 |
| Всегда рад помочь АХТУНГ! На страничке "Virtual-key codes" коды клавиш приведены в hex. Так что виртуальный код латинской клавиши 'A' не 41, а 0x41 = 65 = 'A'. |
| Автор: xPATRIOTx 4.12.2006, 12:36 | ||
| хочу написать прогу которая заменяет нажатые клавиши, прочитал все вышенаписанное, но неполучается программа перехватывает только самое первое нажатие, остальные не перехватываются
|
| Автор: Sheff 5.12.2006, 11:36 | ||
xPATRIOTx,
Ну ясное дело, обработчик блокируется пока не нажмёшь ok, ты лучше не MessageBox юзай, а кидай в файл или юзай макрос TRACE0, в этом случае TRACE0 наверное лучше. |