Язык и раскладка клавиатуры Язык и раскладка клавиатуры
Переключение языка из программы |
*
| *
|
| |
Для переключения языка применяется вызов LoadKeyboardLayout:
var
russian, latin: HKL;
russian := LoadKeyboardLayout('00000419', 0);
latin := LoadKeyboardLayout('00000409', 0);
-- -- -- -- -- где то в программе --- --- ---
SetActiveKeyboardLayout(russian);
Регистрация переключения раскладки клавиатуры |
*
| *
|
| |
При переключении языка ввода активное окно активного приложения получает
два сообщения:
- WM_INPUTLANGCHANGEREQUEST - уведомление приложения о том, что пользователь
инициирует смену языка ввода (при этом смена языка ввода еще не произошла).
При этом приложение может заблокировать смену языка ввода, перехватив данное сообщение
- WM_INPUTLANGCHANGE - данное сообщение передается приложению после смены языка вводимых
символов
Продемострировать работу с данными сообщениями можно на следующем примере:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MsgHandler;
end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_INPUTLANGCHANGEREQUEST then begin
Memo1.Lines.Add('Запрос на смену языка ввода - '+IntToStr(Msg.lParam));
end;
if Msg.message = WM_INPUTLANGCHANGE then begin
Memo1.Lines.Add('Язык ввода изменен - '+IntToStr(Msg.lParam));
end;
end;
В данном примере производится перехват всех сообщений, получаемых приложением.
Любопытно заметить, что приложение получает сообщения WM_INPUTLANGCHANGEREQUEST
и WM_INPUTLANGCHANGE, но наш обработчик получает только WM_INPUTLANGCHANGEREQUEST.
Поэтому использовать следует именно WM_INPUTLANGCHANGEREQUEST, при этом
можно анализировать значение, передаваемое ему через lParam - этот параметр
содержит HKL - Handle клавиатурной ракладки (его можно узнать
при помощи функции LoadKeyboardLayout).
Блокировка переключения раскладки клавиатуры |
*
| *
|
| |
Блокировка переключения раскладки клавиатуры в приложении реализуется
достаточно просто - необходимо перехватить сообщение WM_INPUTLANGCHANGEREQUEST.
Это реализовано в примере:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MsgHandler;
end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_INPUTLANGCHANGEREQUEST then
if CheckBox1.checked then
Handled := true;
end;
В данном случае при включении переключателя CheckBox1 переключение раскладки
клавиатуры в приложении блокируется (но в других приложениях оно будет работать)
© Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта
необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru