Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Разделение ввода от нескольких клавиатур

23.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Разделение ввода от нескольких клавиатур

В одной из прошлых статей мы научились получать список всех устройств, реальных и виртуальных, которые используются для ввода. А можно ли каким-то образом разделять данные, полученные от разных источников? Например, к компьютеру подключены несколько клавиатур и надо определить, на какой именно клавиатуре была нажата клавиша. Ответ - да, можно. Приложение может подписаться на нужные устройства ввода при помощи функции RegisterRawInputDevices. При получении "сырого" ввода от каждого из устройств выбранного типа, система будет посылать приложению сообщение WM_INPUT, а приложению останется его правильно обработать.

Читать статью целиком »
Просмотров: 315 | Комментариев: 5

Hotkey Helper 1.1

21.09.2020 | Категория: Мои программы | Автор: ManHunter

Скриншот программы Hotkey Helper

Небольшая программа-помощник для программистов. Показывает коды нажатых клавиш, значения параметров wParam и lParam сообщений WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_UNICHAR, WM_APPCOMMAND (мультимедийные клавиши), WM_DEADCHAR и WM_SYSDEADCHAR (умляуты, акуты, ударения и подобные модификаторы), а также коды горячих клавиш из поля msctls_hotkey32. Предусмотрены отдельные версии для работы с юникодом и ANSI. Программа написана для личных нужд, но может быть пригодится кому-нибудь еще.

Читать статью целиком »
Просмотров: 924 | Комментариев: 23

Как получить список устройств ввода

26.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как получить список устройств ввода

Как узнать, подключена ли к компьютеру клавиатура и/или мышь? Ответить на этот вопрос можно путем перечисления всех подключенных системных устройств ввода при помощи функции GetRawInputDeviceList. Она позволяет получить список идентификаторов и типов устройств ввода, а на основании идентификатора при помощи функции GetRawInputDeviceInfo можно узнать об этом устройстве более детальную информацию.

Читать статью целиком »
Просмотров: 506 | Комментариев: 8

Эмуляция нажатия мультимедийных клавиш на клавиатуре

18.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
В статье про обработку мультимедийных кнопок я немного коснулся эмуляции их нажатий. Там эмуляция была направлена напрямую в оболочку, сейчас же я расскажу, как выполнять такое действие полноценно, с учетом интересов всех запущенных приложений. Начнем с эмуляции пользовательского ввода с помощью функции SendInput.

При всей моей любви к FASM, просто убивает скудность его инклудов. Похоже, что наполнение их данными остановилось на Win2000, а если захочется что-нибудь чуть новее, то все, добро пожаловать в MSDN. И хорошо, если структура окажется на пять-десять записей. Вот и сейчас нам придется самостоятельно описать структуру INPUT и обозначить коды мультимедийных клавиш.
  1. struct MOUSEINPUT
  2.         dx          dd ?
  3.         dy          dd ?
  4.         mouseData   dd ?
  5.         dwFlags     dd ?
  6.         time        dd ?
  7.         dwExtraInfo dd ?
  8. ends
  9.  
  10. struct KEYBDINPUT
  11.         wVk         dw ?
  12.         wScan       dw ?
  13.         dwFlags     dd ?
  14.         time        dd ?
  15.         dwExtraInfo dd ?
  16. ends
  17.  
  18. struct HARDWAREINPUT
  19.         uMsg        dd ?
  20.         wParamL     dw ?
  21.         wParamH     dw ?
  22. ends
  23.  
  24. struct INPUT
  25.         type        dd ?
  26.         union
  27.             mi      MOUSEINPUT
  28.             ki      KEYBDINPUT
  29.             hi      HARDWAREINPUT
  30.         ends
  31. ends
  32.  
  33. INPUT_KEYBOARD = 1
  34.  
  35. VK_VOLUME_UP   = 0xAF
  36. VK_VOLUME_DOWN = 0xAE
  37. VK_LAUNCH_APP2 = 0xB7
Структура INPUT задана через union, так как в зависимости от типа использования, внутри нее будет структура с разным количеством и разрядностью полей. В нашем случае будет эмуляция только клавиатурного ввода, но на будущее могут пригодиться и другие структуры.

Читать статью целиком »
Просмотров: 425 | Комментариев: 2

Как узнать раскладку клавиатуры другого приложения

21.01.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем, как можно узнать раскладку клавиатуры, которая активна в окне того или иного приложения. Также она может называться идентификатор языка ввода. С оконными приложениями все просто. Зная хэндл окна, через GetWindowThreadProcessId получаем идентификатор процесса, которому принадлежит исследуемое окно, а затем с помощью функции GetKeyboardLayout получаем код раскладки клавиатуры, которая активна в этом окне. Для консольных окон немного сложнее, так как они не реагируют на GetKeyboardLayout. Но это можно сделать при помощи недокументированной функции GetConsoleKeyboardLayoutName, которая возвращает код раскладки клавиатуры в виде строки. Просто так работать с консолью нельзя, для этого надо предварительно приаттачиться к процессу консольного окна, а после получения нужных данных отключиться от него.
  1.         ; Получить активное окно
  2.         invoke  GetForegroundWindow
  3.         ; Получить идентификатор процесса
  4.         invoke  GetWindowThreadProcessId,eax,pID
  5.         mov     ebx,eax
  6.  
  7.         ; Это консольное окно?
  8.         invoke  AttachConsole,[pID]
  9.         or      eax,eax
  10.         jz      .loc_gui
  11.  
  12. .loc_console:
  13.         ; Получить раскладку консольного окна
  14.         invoke  GetConsoleKeyboardLayoutName,buff
  15.         or      eax,eax
  16.         jnz     @f
  17.  
  18.         ; Не получилось, отключиться от консоли
  19.         invoke  FreeConsole
  20.         ; Попробовать получить раскладку как у оконного приложения
  21.         jmp     .loc_gui
  22. @@:
  23.         ...
  24.         ; В buff строка с кодом раскладки типа "00000419"
  25.         ...
  26.  
  27.         ; Просто отключиться от консоли
  28.         invoke  FreeConsole
  29.         jmp     .loc_done
  30.  
  31. .loc_gui:
  32.         ; Получить идентификатор раскладки клавиатуры
  33.         invoke  GetKeyboardLayout,ebx
  34.         and     eax,0xFFFF
  35.         ...
  36.         ; В EAX код раскладки
  37.         ...
  38. .loc_done:
  39.         ...
Если все прошло нормально, то у нас будет или числовой код раскладки, или строка с кодом раскладки, из которой этот код можно легко извлечь. Конечно, пользователю правильнее будет показывать не просто набор цифр, а человекопонятные названия раскладки. Соответствие кодов раскладок названиям языков можно посмотреть в MSDN, а можно переложить эту задачу на систему и воспользоваться функцией VerLanguageName или GetKeyboardLayout с флагом LOCALE_SLANGUAGE.

Читать статью целиком »
Просмотров: 519 | Комментариев: 10

prev 01 02
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0475 сек.) / Память: 4.75 Mb
Наверх