Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отловить момент смены раскладки? (язык ввода) 
:(
    Опции темы
timself
Дата 20.10.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



Подскажите, пожалуйста, как в своей программе отловить момент смены раскладки клавиатуры (языка ввода). Причем не важно как она происходит, программно или по нажатию Ctrl+Shift, или еще как, тут важен сам факт. Какие языки в системе - тоже не важно. 
Отлов нажатия спец. клавиш мне не подходит:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
Код

begin
    if ((ssCtrl in Shift) and (ssShift in Shift)) or
       ((ssAlt in Shift) and (ssShift in Shift)) or (Key=192) then
       begin
       // <----- тут проверка...
       // ...она опережает момент смены раскладки (!)
       end;
end;

Пробовал делать и так:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   if GetKeyboardLayout(0) = 67699721 then Label1.Caption:='EN'
   else Label1.Caption:='RU';   
end;

Это работает. Но это тупо! (тут каждые полсекунды таймер проверяет раскладку). 
Может система выдает сообщение о смене раскладки? Подскажите как сделать...
PM MAIL   Вверх
Rrader
  Дата 20.10.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Ловить сообщение WM_INPUTLANGCHANGEREQUEST


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
timself
Дата 20.10.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



А можно пример, хоть простенький, как отловить это сообщение?
(с синтаксисом не особо знаком)
PM MAIL   Вверх
Christoph
Дата 21.10.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
  procedure CatchTheMess(var Message: TMessage); message WM_INPUTLANGCHANGEREQUEST;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CatchTheMess(var Message: TMessage);
begin
  ShowMessage('Переключили клавиатуру');
end;

end.


Catch The Mess ;)


--------------------
user posted image
PM MAIL ICQ   Вверх
Frees
Дата 21.10.2008, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Christoph, ммм у меня не работает, потому что виста. если ОС виста то я по таймеру смотрю какой язык, но наверно есть болие лучшее решение.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Christoph
Дата 21.10.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



Frees, на ХР работает, мне кажется что это самый простой способ словить сообщение smile


--------------------
user posted image
PM MAIL ICQ   Вверх
Frees
Дата 21.10.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Christoph, согласен что самый простой, тока хочется что бы и в висте работало, может для вистой месагу другую надо ловить


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
MetalFan
Дата 21.10.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



в инете однозначного решения проблемы не нашел, но народ тоже с эти сталкивается.
имхо надо копать в сторону ITfLanguageProfileNotifySink


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Poseidon
Дата 21.10.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



 smile 

Christoph, про соглашение об именах процедур что-нить читал?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
timself
Дата 21.10.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



Надо так делать..., но не могу теперь установить локальный хук!  (Vista)
Копилятор стопорится на SetWindowsHookEx.
Пишет, что:   Incompartible tipes: "Integer" and "Cardinal"
Где тут ошибка ???   Ничего не пойму...
Код

var
  Form1: TForm1;
  FMsgHook:HHOOK;
...
function MsgHookProc(nCode:Integer;wParam:UINT;lParam:UINT):LRESULT; stdcall;
begin
  if nCode>=0 then
  if (PMsg(lParam).message=WM_INPUTLANGCHANGEREQUEST) or
  (PMsg(lParam).message=WM_INPUTLANGCHANGE) then beep;
  Result:=CallNextHookEx(FMsgHook,nCode,wParam,lParam);
end;
...
// установка ловушки
procedure TForm1.Button1Click(Sender: TObject);
begin
  // ниже вылазит ошибка...
  FMsgHook:=SetWindowsHookEx(WH_GETMESSAGE,MsgHookProc,0,GetCurrentThreadId);
  Win32Check(FMsgHook<>0);
end;
...

PM MAIL   Вверх
Christoph
Дата 21.10.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



Цитата(Poseidon @ 21.10.2008,  11:59)
smile 

Christoph, про соглашение об именах процедур что-нить читал?

Я Исправлюсь  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
MetalFan
Дата 21.10.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



сверь типы параметров у SetWindowsHookEx


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
timself
Дата 21.10.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



Спасибо, с этим я разобрался, там ошибка синтаксиса MsgHookProc вместо @MsgHookProc.
Но WM_INPUTLANGCHANGE и WM_INPUTLANGCHANGEREQUEST всё равно не ловятся под OS Vista.
Перепробывал все варианты, не отлавливается, и всё тут. Может в Висте другое сообщение при смене раскладки... Это напасть какая-то.
PM MAIL   Вверх
Christoph
Дата 21.10.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



Может быть ActivateKeyboardLayout, но я не знаю подойдет ли для твоей задачи или нет :(


--------------------
user posted image
PM MAIL ICQ   Вверх
timself
Дата 22.10.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



Проблема решена обходным методом. Сообщение так и не удалось поймать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0894 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.