
Как узнать раскладку клавиатуры другого приложения
Сегодня разберем, как можно узнать раскладку клавиатуры, которая активна в окне того или иного приложения. Также она может называться идентификатор языка ввода. С оконными приложениями все просто. Зная хэндл окна, через GetWindowThreadProcessId получаем идентификатор процесса, которому принадлежит исследуемое окно, а затем с помощью функции GetKeyboardLayout получаем код раскладки клавиатуры, которая активна в этом окне. Для консольных окон немного сложнее, так как они не реагируют на GetKeyboardLayout. Но это можно сделать при помощи недокументированной функции GetConsoleKeyboardLayoutName, которая возвращает код раскладки клавиатуры в виде строки. Просто так работать с консолью нельзя, для этого надо предварительно приаттачиться к процессу консольного окна, а после получения нужных данных отключиться от него.Code (Assembler) : Убрать нумерацию
- ; Получить активное окно
- invoke GetForegroundWindow
- ; Получить идентификатор процесса
- invoke GetWindowThreadProcessId,eax,pID
- mov ebx,eax
- ; Это консольное окно?
- invoke AttachConsole,[pID]
- or eax,eax
- jz .loc_gui
- .loc_console:
- ; Получить раскладку консольного окна
- invoke GetConsoleKeyboardLayoutName,buff
- or eax,eax
- jnz @f
- ; Не получилось, отключиться от консоли
- invoke FreeConsole
- ; Попробовать получить раскладку как у оконного приложения
- jmp .loc_gui
- @@:
- ...
- ; В buff строка с кодом раскладки типа "00000419"
- ...
- ; Просто отключиться от консоли
- invoke FreeConsole
- jmp .loc_done
- .loc_gui:
- ; Получить идентификатор раскладки клавиатуры
- invoke GetKeyboardLayout,ebx
- and eax,0xFFFF
- ...
- ; В EAX код раскладки
- ...
- .loc_done:
- ...
К большому сожалению, трюк с функцией GetConsoleKeyboardLayoutName закончился на Windows 7, на современных системах эта функция не работает, всегда возвращая дефолтный код английской раскладки. И я пока не знаю способа, как это побороть. Система с этим справляется, но делает это на уровне драйвера клавиатуры, а предлагаемое решение работает из usermode.
В приложении пример программы с исходным текстом, которая получает код раскладки для активного консольного или оконного приложения.
Просмотров: 1606 | Комментариев: 10

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

user
(15.04.2020 в 11:45):
Ещё, кстати же, непонятная особенность Windows 7(x64), обнаружилась в связи с этой же программкой:
Если в ней нажать на updown-контрол для инкремента/декремента года календаря, и удерживать его,
то текст календаря перерисовывается рывками.
Под WinXP (х32), равно как под Win10(x64) текст пререрисовывается шустро и без рывков.
Проверял на разных системах, всюду так.
Не знаю, как оно на Win7(x32), не было в наличии.
Если в ней нажать на updown-контрол для инкремента/декремента года календаря, и удерживать его,
то текст календаря перерисовывается рывками.
Под WinXP (х32), равно как под Win10(x64) текст пререрисовывается шустро и без рывков.
Проверял на разных системах, всюду так.
Не знаю, как оно на Win7(x32), не было в наличии.

user
(15.04.2020 в 11:30):
О. Пока возился со статьёй заодно отловил бажек в старой софтинке.
Кстати, софтинка представляет собой "вечный календарь" моего собственного алгоритма. Распечатка календаря любого года в выбранном стиле летоисчисления.
Та программка уже упоминалась, в связи с обсуждением корректного копирования текста с кириллицей в буффер обмена.
Тогда пришёл к выводу, что текст копируется корректно и без ухищрений, если в приложении, из которого он копируется, установлена текущей раскладка кириллицы.
В софтинке есть опция - "kbd", по умолчанию включена.
Это значит, что по умолчанию при копировании текста будет устанавливаться тот лайоут, который задан текущим для отображения текста календаря.
Бажек был в том, что при запуске проги забывал проинициализировать эту опцию и она включалась не сразу.
А программка довольно-таки юсефул, сам пользуюсь в качестве клендарика, какие ещё были маленькие картонные.
Рекомендую:
http://old-dos.ru/dl.php?id=21233
Кстати, софтинка представляет собой "вечный календарь" моего собственного алгоритма. Распечатка календаря любого года в выбранном стиле летоисчисления.
Та программка уже упоминалась, в связи с обсуждением корректного копирования текста с кириллицей в буффер обмена.
Тогда пришёл к выводу, что текст копируется корректно и без ухищрений, если в приложении, из которого он копируется, установлена текущей раскладка кириллицы.
В софтинке есть опция - "kbd", по умолчанию включена.
Это значит, что по умолчанию при копировании текста будет устанавливаться тот лайоут, который задан текущим для отображения текста календаря.
Бажек был в том, что при запуске проги забывал проинициализировать эту опцию и она включалась не сразу.
А программка довольно-таки юсефул, сам пользуюсь в качестве клендарика, какие ещё были маленькие картонные.
Рекомендую:
http://old-dos.ru/dl.php?id=21233

ManHunter
(03.02.2020 в 08:08):
Моего железа под мои же задачи мне хватит еще на много-много лет. Ни одной действительно веской причины уходить с Windows 7 я пока не обнаружил. Это же касается повседневного набора софта - все нужное уже написано, а по мелочи я и сам могу для себя что-нибудь нарисовать.
Пример с SoftICE не самый удачный. NuMega Lab купили Compuware и просто тупо убили качественный продукт. С тех пор никаких достойных альтернатив такого уровня не появилось, Syser попытался, но у него не получилось. И что, от появления бесятки внезапно материализовался офигенный ядерный отладчик, который работает только на ней и не работает на младших системах? Нет. Многие инструменты типа автоматических распаковщиков корректно работают только на WinXP, максимум на Win7, поэтому у меня для них выделена аж отдельная физическая машина. Вылупилась бесятка, хомячки счастливы, а ломать все равно приходится на старых системах.
Необходимость обновления возникает только при появлении каких-то "киллер-фич", которые могут работать исключительно на новой системе. Вот появится, например, процессор, который за полчаса разложит RSA1024, но который при этом работает только под управлением 10. Ок, прикуплю тестовую машину с этой системой, буду запускать по мере надобности.
Пример с 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, как и у меня на десятке, раскладка клавиатуры меняется для всех окон одновременно (независимо от консольности).
Т.е. теперь нет разных состояний раскладок для разных окон, раскладка в один момент времени всегда одна для всех окон.
Т.е. теперь нет разных состояний раскладок для разных окон, раскладка в один момент времени всегда одна для всех окон.

Добавить комментарий
Заполните форму для добавления комментария

И окончательно загнулся он под WinXP/SP3.
Они его не убили, просто не потянули взятое на себя.
Называется - не мала баба клопоту - й купила порося.
И кстати, ещё не факт, что сами NuMega'вцы дальше нормально бы её поддерживали.
Может, уже и сами выдохлись, потому и избавились от продукта, по нормальной цене.
Не известно, насколько вообще выгодно было торговать тем отладчиком.
Похоже, что процент регистрированных юзеров там был ничтожный.
Жаль конечно.
Продукт был эпичный.