Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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.

К большому сожалению, трюк с функцией GetConsoleKeyboardLayoutName закончился на Windows 7, на современных системах эта функция не работает, всегда возвращая дефолтный код английской раскладки. И я пока не знаю способа, как это побороть. Система с этим справляется, но делает это на уровне драйвера клавиатуры, а предлагаемое решение работает из usermode.

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

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

Keyboard.Layout.Demo.zip (2,666 bytes)


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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (03.02.2020 в 08:08):
Моего железа под мои же задачи мне хватит еще на много-много лет. Ни одной действительно веской причины уходить с Windows 7 я пока не обнаружил. Это же касается повседневного набора софта - все нужное уже написано, а по-мелочи я и сам могу для себя что-нибудь нарисовать.

Пример с SoftICE не самый удачный. NuMega Lab купили Compuware и просто тупо убили качественный продукт. С тех пор никаких достойных альтернатив такого уровня не появилось, Syser попытался, но у него не получилось. И что, от появления бесятки внезапно материализовался офигенный ядерный отладчик, который работает только на ней и не работает на младших системах? Нет. Многие инструменты типа автоматических распаковщиков корректно работают только на WinXP, максимум на Win7, поэтому у меня для них выделена аж отдельная физическая машина. Вылупилась бесятка, хомячки счастливы, а ломать все равно приходится на старых системах.

Необходимость обновления возникает только при появлении каких-то "киллер-фич", которые могут работать исключительно на новой системе. Вот появится, например, процессор, который за полчаса разложит RSA1024, но который при этом работает только под управлением 10. Ок, прикуплю тестовую машину с этой системой, буду запускать по мере надобности.
Алексей (03.02.2020 в 08:02):
ManHunger прям так говорите, как будто это правда :) Многие наверное помнят времена "SoftICE" Так вот для 7 _ки, они тоже наступят. Поддержки уже нет, а это значит и смысла под неё писать в будущим - ну просто НЕТ. Всё пойдет с драйверов и потихоньку-потихоньку, она уйдет в небытие. Хотя может кто то тешит себя какой не будь "Super windows 11" или 12!
Владимир (02.02.2020 в 08:58):
Цитатабуду признателен за инфу по такой настройке

Параметры=>Устройства=>Ввод=>Дополнительные параметры клавиатуры=>Позволить выбирать метод ввода для каждого окна приложения
антон (01.02.2020 в 21:29):
Vnv, буду признателен за инфу по такой настройке
Vnv (01.02.2020 в 21:23):
Цитатараскладка в один момент времени всегда одна для всех окон.

Брехня, это все настраивается.
ManHunter (01.02.2020 в 19:42):
Цитатараскладка в один момент времени всегда одна для всех окон

Отлично. Теперь я знаю еще одну причину никогда не переходить на всякие бесятки и прочую нечисть.
антон (01.02.2020 в 18:29):
Я могу ошибаться в отношении других систем (после семерки), но скорее всего на 8-10, как и у меня на десятке, раскладка клавиатуры меняется для всех окон одновременно (независимо от консольности).
Т.е. теперь нет разных состояний раскладок для разных окон, раскладка в один момент времени всегда одна для всех окон.

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

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

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