Blog. Just Blog

Обработка и эмуляция мультимедийных кнопок клавиатуры

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Обработка и эмуляция мультимедийных кнопок клавиатуры
Обработка и эмуляция мультимедийных кнопок клавиатуры

Практически все современные клавиатуры имеют несколько специальных, так называемых мультимедийных кнопок для управления громкостью звука, навигацией браузера, плеером, запуска почтовой программы или калькулятора и так далее. Их количество и функционал зависит от производителя и модели клавиатуры. Особенностью этих кнопок является то, что при нажатии они не генерируют скан-кодов, не порождают события типа WM_KEYDOWN, не отслеживаются в полях ввода типа msctls_hotkey32.

Но оказывается, что работать с ними очень просто. В процедуре обработки окна надо отслеживать сообщение WM_APPCOMMAND, оно приходит, когда окно активно и нажата какая-либо мультимедийная кнопка.
  1.         WM_APPCOMMAND = 0x319
  2.         ...
  3.         ; Пришло сообщение от мультимедийной кнопки?
  4.         cmp     [msg],WM_APPCOMMAND
  5.         je      wm_mmkey
Код нажатой кнопки приходит в младшем слове значения lParam сообщения. Полный список кодов мультимедийных клавиш и их назначение можно посмотреть здесь.
  1. wm_mmkey:
  2.         ; Код нажатой кнопки приходит в lParam
  3.         mov     eax,[lparam]
  4.         shr     eax,16
  5.         ; EAX = код кнопки
  6.         ...
Если ваше приложение должно обрабатывать только часть мультимедийных кнопок, то ваш обработчик сообщения WM_APPCOMMAND должен пропускать его дальше по цепочке системных обработчиков. Для установки глобального обработчика этого сообщения, который будет работать не только когда окно активно, придется воспользоваться инжектом dll во все активные процессы.

От обработки переходим к эмуляции нажатий мультимедийных кнопок. Эмуляцию можно использовать не только для имеющихся кнопок, но и в том случае, когда на клавиатуре какие-либо кнопки отсутствуют или даже вообще нет ни одной мультимедийной кнопки. Использовать эмуляцию нажатий на мультимедийные кнопки гораздо проще и удобнее, чем, например, регулировать громкость или отключать звук средствами WinAPI, так что этот способ может оказаться весьма полезным.
  1.         WM_APPCOMMAND = 0x319
  2.         ...
  3.         ; Получить хэндл рабочего стола
  4.         invoke  GetShellWindow
  5.         ; Отправить ему сообщение о нажатии кнопки "Calculator"
  6.         invoke  SendMessage,eax,WM_APPCOMMAND,0,(12h shl 16)
  7.         ...
Функции некоторых кнопок можно переопределить. Описание, какая кнопка за что отвечает, хранится в реестре. Название ветки соответствует коду кнопки, а ключ определяет ассоциацию действия или имя исполняемого файла, который будет запущен при нажатии. Вместо стандартного калькулятора или окна "Мой компьютер", например, можно определить запуск другой программы.

REGEDIT4

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\AppKey\15]
"Association"="mailto"

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\AppKey\16]
"Association"=".cda"

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\AppKey\17]
"ShellExecute"="::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\AppKey\18]
"ShellExecute"="calc.exe"

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\AppKey\7]
"Association"="http"

В приложении примеры программ с исходными текстами, одна из которых при активном окне обрабатывает нажатия мультимедийных кнопок и показывает их код, а вторая эмулирует нажатие на кнопку запуска калькулятора.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Multimedia.Keys.Demo.zip (3,145 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 6082 | Комментариев: 8

Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (11.01.2015 в 13:31):
1. Выдрать и заклеить дырки скотчем. Радикально, но наиболее действенно.
2. Поменять клавиатуру.
3. В расширенных настройках плана электропитания поменять действие "Кнопки питания и крышка"
othy (11.01.2015 в 13:25):
А как отследить и заблокировать нажатие кнопок: Power, Sleep. Они порой расположены совсем неудачно.
ManHunter (23.11.2014 в 11:38):
Ну под вайном запустится, внутри ничего недокументированного не используется. А вот будет работать или нет - хз, я на никсах не сижу.
Doxtup (23.11.2014 в 06:19):
Михаил, конечно, особенно импорт рег файла в реестр винды)
Михаил (22.11.2014 в 23:40):
а на OS Linux будет работать?
ManHunter (21.11.2014 в 13:19):
Сделал без переносов.
Андрей (21.11.2014 в 13:15):
У "кода" "REGEDIT4" концы строк уехали "под календарь".
Compiller (21.11.2014 в 11:59):
http://www.seriosoft.org
Очень полезная программа для настройки этих самых клавиш.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.5 Mb
Наверх