Как программно поменять язык ввода
Пользователи, просматривающие топик: 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;
|
|
|
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 Там этот пример реализован.
|
|
|
RE: Как программно поменять язык ввода - 2007-11-09 01:15:07.780000
|
|
|
weak spirit
Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
|
насколько я понял, там показан пример перехвата нажатия клавиши вообще, а меня интересует конкретно левый и правый контролы. ну и другие парные клавиши, вроде правого и левого шифта - с ними та же проблема. upd. пардон, не разобрался с ходу, там дейстивтельно есть пример переключения по одному контролу. спасибо. и всё таки главный вопрос в смене языка ввода.
|
|
|
RE: Как программно поменять язык ввода - 2007-11-09 07:09:38.120000
|
|
|
Alaget
Сообщений: 330
Оценки: 0
Присоединился: 2007-11-08 15:57:53.170000
|
Через реестр поменять можно.
|
|
|
RE: Как программно поменять язык ввода - 2007-11-09 12:28:04.550000
|
|
|
weak spirit
Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
|
насколько я помню, в реестре помечается, какой язык будет стоять по умолчанию при загрузке системы, но никак не текщий язык ввода. поправьте, если я не прав.
|
|
|
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); // для русской
|
|
|
RE: Как программно поменять язык ввода - 2007-11-09 15:09:28.546666
|
|
|
weak spirit
Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
|
перемудрил я, хехе:D пасиба, всё работает
|
|
|
|
|