Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Получение и изменение раскладки клавиатуры

#python #windows #python_3x #winapi


Как можно узнать раскладку клавиатуры в определенном окне/процессе и сменить её?

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

if GetLayout() == 'en' and another_condition:
    LoadLayout('ru')
    do_something()
elif GetLayout() == 'ru' and another_condition:
    LoadLayout('en')
    do_something()


Написано грубо, но суть ясна: необходимо получить текущую раскладку и сменить её.
Подскажите, каким образом это можно сделать? Используется Windows 7 x64.

Нашёл вот такой ответ, но не смог разобраться в коде на C++.
    


Ответы

Ответ 1



Для того, чтобы выполнить задачу необходимо установить дополнительную библиотеку pywin32, которая предоставляет доступ к функциям Windows API из Python. Из этой библиотеки нам понадобится модуль win32api. >>> import win32api Исследовав его содержимое можно увидеть, что для работы с раскладкой клавиатуры есть несколько функций и одно системное сообщение Windows - WM_INPUTLANGCHANGE: GetKeyboardLayout GetKeyboardLayoutList LoadKeyboardLayout В данном случае для нас важна именно последняя функция - LoadKeyboardLayout. Данная функция загружает новую раскладку (если она еще не загружена) и предпринимает после этого еще какие-то действия; принимает в качестве аргументов два параметра: строка с идентификатором раскладки. действие Более подробно о их возможных значениях можно почитать в MSDN. Итак, нам важны две вещи: Получить идентификатор раскладки. Вторым параметром передать действие переключения на загруженную раскладку. Первый параметр мы можем с легкостью получить из реестра по пути: HKEY_CURRENT_USER/Keyboard Layout/Preload. Итак, выберем переключение на русский язык. В реестре видим примерно следующее: Значение записи реестра как раз и будет нужным идентификатором раскладки. Итак, все, что надо сделать: >>> import win32api >>> win32api.LoadKeyboardLayout("00000419",1) Информация взята из блога Ростислава Дзинько

Комментариев нет:

Отправить комментарий