Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как установить Keyboard Layout из Python? Как сменить клавиатурную раскладку? 
:(
    Опции темы
belonesox
  Дата 5.11.2009, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.4.2006
Где: Moscow

Репутация: нет
Всего: 1



Есть задача некой автоматизации/генерации Windows-событий для оконных программ.
Вот минимальный макет - запускаем Блокнот, и бьем некоторое количество нажатий и отпусканий клавиш.
В идеале хотим получить в блокноте "qqqqqqqqqqййййййййййй".

Проблема в том, что нужно уметь не только слать правильные коды клавиш, но и задавать для них правильную раскладку (думаю, у всех читающих есть 409 и 419 локали).

А с этим  проблема - единственный WinAPI-вызов, что можно использовать из кошерных pywin32 модулей  - это LoadKeyboardLayout  (ActivateKeyboardLayout - нету).
Теоретически и его должно хватить - но нет, не получается, какие бы комбинации флагов к нему я не заказывал.

Код

# -*- coding: utf-8 -*-
import win32con
import win32api
import subprocess
import time

p=subprocess.Popen (r"notepad.exe")
time.sleep (1)

vk=81   # это код клавиши "q/й" (в зависимости от раскладки)

for i in xrange(10):  #10 раз печатаем q (если раскладка английская)
    win32api.keybd_event(vk,0,0,0)
    win32api.keybd_event(vk,0,win32con.KEYEVENTF_KEYUP,0)
    time.sleep(0.1)

# Тут хоть тушкой, хоть чучелом - пытаемся сменить раскладку на русскую. Не выходит!
win32api.LoadKeyboardLayout("00000419", win32con.KLF_ACTIVATE|win32con.KLF_REORDER|win32con.KLF_UNLOADPREVIOUS|win32con.KLF_SETFORPROCESS)

# Тут должно быть 10 введенных "й", но увы.
for i in xrange(10):
    win32api.keybd_event(vk,0,0,0)
    win32api.keybd_event(vk,0,win32con.KEYEVENTF_KEYUP,0)
    time.sleep(0.1)


Собственно вопрос  - может кто-то сталкивался с аналогичной задачей и успешно ее решил?
Может это у меня какая-то проблема в "консерватории"?

                Заранее благодарен за ответ, с уважением, Стас Фомин

(Workaround-ы с дополнительными DLL-ями, включая самописные, или использованием hotkey для раскладок сразу бы не хотелось рассматривать, вдруг есть правильное и красивое решение).
PM MAIL WWW   Вверх
shupg
Дата 6.11.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 21.6.2006

Репутация: 2
Всего: 2



LoadKeyboardLayout только добавляет в список возможных расскладок первый параметр. Так как, наверняка, у тебя уже есть в списке русский - ты не видишь изменений.

Может быть воспользоваться CTRL+Shift или типа того?
PM MAIL   Вверх
belonesox
Дата 6.11.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.4.2006
Где: Moscow

Репутация: нет
Всего: 1



Цитата

LoadKeyboardLayout только добавляет в список возможных расскладок первый параметр. 

Да нет, он должен и активную раскладку менять (с соотв. флагами).

Проблема только в том (IMHO), что раскладку он меняет не у Notepada (которому шлют кейкоды), а у питоновского процесса, т.е. эффекта никакого нет. 
Поменять раскладку кейкодами можно, но некрасиво
(ибо идея — по символу выяснить кейкод и раскладку, и перед посылкой каждого кейкода слать хоткеи выбора раскладки — уродлива до невозможности).

Для своей задачи — слать символы в окно я понятно, перейду на простой SendMessage/WM_CHAR, но думал, что может просто что-то не так понимаю (ну эта возможность еще сохраняется, да).

Просто такая ситуация (если я не ошибся) — это, например, приговор библиотекам SendKey (и pywinauto), которые шлют символы через keybd_event (смесь русского с английским  они слать не смогут, пока весь нижний уровень не переписать).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.