Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как программно поменять язык ввода

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Как программно поменять язык ввода
Имя
Сообщение << Старые топики   Новые топики >>
Как программно поменять язык ввода - 2007-11-08 21:43:58.693333   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
вообще цель такая: написать программу, которая будет ловить нажатия определённых клавиш и переключать по ним язык ввода. почти написал, но возникло 2 трабла. во-первых, не все клавиши отлавливливаются, а именно не отлавливается правый и левый контрол. то есть общий код обоих контролов (VK_CONTROL) ловит, а коды по отдельности (VK_RCONTROL, VK_LCONTROL) - нет:

procedure RunHook export; stdcall; begin SysHook := SetWindowsHookEx(WH_KEYBOARD, @SysMsgProc, HInstance, 0); end; function SysMsgProc(code: Integer; wParam: Word; lParam: Longword): Longword; stdcall; begin CallNextHookEx(SysHook, code, wParam, lParam); if (((lParam shr 16) and KF_UP) = 0) and (wParam = VK_CONTROL) then begin //работает нормально, ловит оба контрола // and (wParam = VK_RCONTROL) then begin //не ловит ничего ChangeLanguage end; result := 0 end;
во-вторых, непосредственно не работает переключение языков, вернее на один язык - на русский (с английского). наоборот всё работает нормально:

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;
Post #: 1
RE: Как программно поменять язык ввода - 2007-11-09 00:08:04.280000   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
В Delphi Magazine № 26 October, 1997 есть статья
Trapping Keystrokes
Author - Warren Kovach
Там этот пример реализован.

Post #: 2
RE: Как программно поменять язык ввода - 2007-11-09 01:15:07.780000   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
насколько я понял, там показан пример перехвата нажатия клавиши вообще, а меня интересует конкретно левый и правый контролы. ну и другие парные клавиши, вроде правого и левого шифта - с ними та же проблема.

upd. пардон, не разобрался с ходу, там дейстивтельно есть пример переключения по одному контролу. спасибо.

и всё таки главный вопрос в смене языка ввода.
Post #: 3
RE: Как программно поменять язык ввода - 2007-11-09 07:09:38.120000   
Alaget

Сообщений: 330
Оценки: 0
Присоединился: 2007-11-08 15:57:53.170000
Через реестр поменять можно.
Post #: 4
RE: Как программно поменять язык ввода - 2007-11-09 12:28:04.550000   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
насколько я помню, в реестре помечается, какой язык будет стоять по умолчанию при загрузке системы, но никак не текщий язык ввода. поправьте, если я не прав.
Post #: 5
RE: Как программно поменять язык ввода - 2007-11-09 14:37:01.103333   
spi

Сообщений: 11
Оценки: 0
Присоединился: 2007-11-01 11:33:20.090000
смена языка производится все лишь вызовом одной функции:
LoadKeyboardLayout('00000409', KLF_ACTIVATE); // для английской LoadKeyboardLayout('00000419', KLF_ACTIVATE); // для русской
Post #: 6
RE: Как программно поменять язык ввода - 2007-11-09 15:09:28.546666   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
перемудрил я, хехе:D пасиба, всё работает
Post #: 7
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Как программно поменять язык ввода







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.