понедельник, 1 ноября 2010 г.

Python: как программно переключить раскладку клавиатуры в Windows

Исследовав данный вопрос, я обнаружил, что Python не имеет средств из коробки для решения этой задачи. Соответственно, задача должна решаться для каждой ОС своим путем. Данное решение было найдено мной для ОС Windows XP +.

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

Значение записи реестра как раз и будет нужным идентификатором раскладки.
Итак, все, что надо сделать:
>>> import win32api
>>> win32api.LoadKeyboardLayout("00000419",1)

4 комментария:

  1. Я так понял, что значения в реестре для русской раскладки на каждой машине будет одинаковым?
    Как себя ведет эта функция, если у пользователя нет такой раскладки: функция LoadKeyboardLayout подключит ее в любом случае или выдаст ошибку?

    ОтветитьУдалить
  2. > Я так понял, что значения в реестре для русской раскладки на каждой машине будет одинаковым?

    Верно, это идентификаторы раскладок для клавиатуры в ОС Windows XP, Vista, 7, и на всех машинах с данными системами, они одинаковы.

    > Как себя ведет эта функция, если у пользователя нет такой раскладки: функция LoadKeyboardLayout подключит ее в любом случае или выдаст ошибку?

    Если у пользователя нет такой раскладки LoadKeyboardLayout ее загружает, если есть - не загружает =), так как она уже есть. В этом случае сработает только второй параметр, который скажет, что сделать дальше - в случае, когда значение второго параметра - 1, выполнится переключение раскладки. Есть и другие значения, можно посмотреть в MSDN, в посте есть ссылка.

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Чтобы ускорить и упростить роботу с Win appi есть html5 шаблон , которые улучшат уровень поддержки мультимедиа-технологий, и прочих программ.

    ОтветитьУдалить

В этом гаджете обнаружена ошибка