Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Текущая раскладка клавиатуры


Автор: Rodman 3.9.2006, 22:18
Дароф. Кто нить может мне подсказать как считать программно какой язык включен (русский, английский и т.д.)... от отловить переключение (не зависимо от того как человек переключается - на Ctrl+Shift или Alt+Shift)...


Спасибо... smile  smile  smile 

Автор: Lence 3.9.2006, 22:53
определяешь через GetKeyboardLayoutName(Lang) ; какие цифры на конце 
Код

var 
s: string
 Lang: Array[0..$FFF] of Char; 
begin 
 GetKeyboardLayoutName(Lang) ;   
 s := StrPas(Lang);   
 if s = '00000419' then     
  Label1.caption:='Ru'    
 else    
   if s = '00000409' then     
     Label1.caption:='Eng'   
   else     
       Label1.caption:='Other'     
end;  


Автор: Rodman 3.9.2006, 23:18
Спасибо, но вот второй вопрос был.... Есть ли какой нить сигнал который можно перехватить при переключении (Ctrl+Shift или Alt+Shift)???? Или проверять оба варианта???

Автор: Lence 3.9.2006, 23:27
Цитата(Rodman @  3.9.2006,  23:18 Найти цитируемый пост)
пасибо, но вот второй вопрос был.... Есть ли какой нить сигнал который можно перехватить при переключении (Ctrl+Shift или Alt+Shift)???? Или проверять оба варианта??? 


можно  HOOK повесить на комбинации клавишь ....  или тебе системно надо узнать  смену языка ? 

Автор: Rodman 3.9.2006, 23:47
Я понимаю что можно повесить на клавиши, но а если перемена языка произойдет с помощью мышки, то я не отслежу это... так что как-то необходимо перехватить сигнал??? но я не могу пока понять как это сделать???

Автор: Fedia 4.9.2006, 06:20
Цитата(Rodman @  3.9.2006,  23:47 Найти цитируемый пост)
так что как-то необходимо перехватить сигнал??? но я не могу пока понять как это сделать???

Перехватить изменение раскладки клавиатуры можно в Application.OnMessage, перехватывая сообщение WM_INPUTLANGCHANGEREQUEST. Примерно так:
Код

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_INPUTLANGCHANGEREQUEST then
  ShowMessage('Изменилась раскладка клавиатуры');
end;
//.......
//Присваиваем обработчик события (например, при загрузке формы)
Application.OnMessage:=AppMsg;

Автор: Rodman 4.9.2006, 18:38
А если к примеру я буду проверять раскладку при вводе, то мне необходимо

Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Application.OnMessage:=AppMsg;
end;


или я не правильно понял перехват???

Автор: Alexeis 4.9.2006, 20:49
Цитата(Rodman @  4.9.2006,  18:38 Найти цитируемый пост)
или я не правильно понял перехват??? 

Угу Fedia показал метод перехвата изменения раскладки в тот момент когда она реально производится.

Application.OnMessage:=AppMsg; - имеет смысл присваивать в обработчике onCreate формы

в 
Код

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_INPUTLANGCHANGEREQUEST then
  ShowMessage('Изменилась раскладка клавиатуры');
end;


имеет смысл вставить

Код

var 
s: string
 Lang: Array[0..$FFF] of Char; 
begin 
 GetKeyboardLayoutName(Lang) ;   
 s := StrPas(Lang);   
 if s = '00000419' then     
  Label1.caption:='Ru'    
 else    
   if s = '00000409' then     
     Label1.caption:='Eng'   
   else     
       Label1.caption:='Other'     
end;  


т.е. определение какую раскладку установили (в тот момент когда установили, поскольку сообщение прийдет сразу после изменения раскладки)

Автор: Yanis 5.9.2006, 13:30
Rodman
Отслеживать изменение нужно в своём приложении или вообще в системе, независимо от того активна программа или нет?

Автор: Rodman 6.9.2006, 11:55
Отследить мне нужно только во время работы моего приложения, конкретно во время ввода пароля... Как в WebMoney... во время ввода возле поля высвечивается текущий язык...

Автор: Yanis 6.9.2006, 12:01
Цитата(Rodman @  6.9.2006,  12:55 Найти цитируемый пост)
Как в WebMoney... во время ввода возле поля высвечивается текущий язык... 

Для отображения текущего языка можно просто проверять его в OnIdle, если ты об этом.

Автор: Alexeis 6.9.2006, 12:03
тогда 
Код

Application.OnMessage:=AppMsg;

надо присвоить сразу после создания (показа) дилога (панели) для ввода пароля.

И
Код

Application.OnMessage:= nil;


после завершения оперции (успешного входа)

Автор: Rodman 6.9.2006, 13:14
А если во время ввода произойдет смета раскладки???

Автор: Alexeis 6.9.2006, 13:17
Rodman, тогда сработает обработчик
Код

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_INPUTLANGCHANGEREQUEST then
  ShowMessage('Изменилась раскладка клавиатуры');
end;

В нем вместо ShowMessage('Изменилась раскладка клавиатуры');
надо вставить код который будет возвращать старую раскладку или все что еще так понадобится.

Автор: Rodman 6.9.2006, 13:23
ОК.... т.е. как я понял на Edit1.OnChange  необходимо повесить 
Код

 Application.OnMessage:=AppMsg; 


Так???

Автор: Yanis 6.9.2006, 13:25
Rodman
Тебе объяснять, что в пустой колодец лить. Сказали же, что в OnCreate.

Автор: Alexeis 6.9.2006, 13:39
Yanis, Я думаю что ему вначале надо почитать, что такое сообщения вообще, как они отсылаются, почему отсылаются и как принимаются и обрабатываются.

Добавлено @ 13:41 
Надо открыть любой учебник по Windows и прочитать хотя бы первую главу.

Автор: Yanis 6.9.2006, 14:39
Цитата(alexeis1 @  6.9.2006,  14:39 Найти цитируемый пост)
Надо открыть любой учебник по Windows и прочитать хотябы первую главу.

Уточнение. Учебник по программированию!

Автор: Rodman 6.9.2006, 16:09
Ну не надо драматизировать. Все когда то начинали, и не у всех все получалось...

Я задал такой вопрос, - "Куда добавлять" потому что OnCreate как Вы знаете выполняется 1 раз, а смена языка может производится неоднократно...

 smile 

Автор: Alexeis 6.9.2006, 16:14
Цитата(Rodman @  6.9.2006,  16:09 Найти цитируемый пост)
Ну не надо драматизировать. Все когда то начинали, и не у всех все получалось...

Мы совсем не драматизируем, все нормально. Просто чтоб начать програмировать под на Delphi необходимо выучить основы програмирования под Windows (хотя бы принципы). Это займет на самом деле часа 3-4, а потом уже многое станет ясным само по себе smile .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)