P.S. нашел решение http://forum.xakep.ru/m_1009422/tm.htm
но там для delphi, как его перенести на python
код1
const
ENGLISH = $409;
RUSSIAN = $419;
....
{активная раскладка в активном окне}
function GetActiveKbdLayoutWnd: LongWord;
var
hWindow,idProcess: THandle;
begin
// получить handle активного окна чужой программы
hWindow := GetForegroundWindow;
// Получить идентификатор чужого процесса
idProcess := GetWindowThreadProcessId(hWindow,nil);
// Получить текущую раскладку в чужой программе
Result:=(GetKeyboardLayout(idProcess) shr $10);
end;
{установить раскладку в активном окне}
procedure SetLayoutActiveWnd(kbLayout : LongWord);
var
Layout: HKL;
hWindow: THandle;
begin
// получить handle активного окна чужой программы
hWindow := GetForegroundWindow;
// Получить ссылку на раскладку
Layout := LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0);
// посылаем сообщение о смене раскладки
SendMessage(hWindow, WM_INPUTLANGCHANGEREQUEST, 1, Layout);
end;
procedure ChangeLanguage;
begin
if GetActiveKbdLayoutWnd = ENGLISH then // получает язык верно
SetLayoutActiveWnd(RUSSIAN) // но не устанавливает русский
else
SetLayoutActiveWnd(ENGLISH) // зато прекрасно устанавливает английский
end;
LoadKeyboardLayout('00000409', KLF_ACTIVATE); // для английской
LoadKeyboardLayout('00000419', KLF_ACTIVATE); // для русской