Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.11.2011, 14:31
WanderAlone WanderAlone вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 3
Репутация: 10
По умолчанию WinAPI window messages (WM_INPUTLANG)

Имею:
MacBook Pro + Win 7 32bit (BootCamp) + Delphi XE2

Делаю:
Код:
type
  OnAppMessage = procedure(var Msg: TMsg; var Handled: Boolean) of Object;

  TfrmMain = class(TForm)
  private
    FAppMessage: OnAppMessage;
    procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
  end;

.....

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FAppMessage := Application.OnMessage;
  Application.OnMessage := Self.ApplicationMessage;
end;

procedure TfrmMain.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_INPUTLANGCHANGE then
    LayoutChange(LoWord(Msg.lParam));
end;

Получаю:
Моё приложение не получает такого сообщения вообще. Меняю раскладку с клавиатуры, меняю мышью в SystemTray - результат ноль.
Ни WM_INPUTLANGCHANGEREQUEST, ни WM_INPUTLANGCHANGE.

Вопрос:
Подскажите, как можно перехватить смену раскладки при таком раскладе :-)
Ответить с цитированием
  #2  
Старый 01.11.2011, 14:55
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

моно таймер и функция чтототипа ...layout... непомню точно
Ответить с цитированием
  #3  
Старый 01.11.2011, 15:02
WanderAlone WanderAlone вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
моно таймер и функция чтототипа ...layout... непомню точно

Конечно, как вариант, можно и таймер повесить, который, как заведенный будет постоянно мониторить изменения раскладки, но имхо это легкий изврат :-)
Может кто-то сталкивался и нашел правильный message от Win 7. Пока что: опытным путем я понял, что в момент смены раскладки винда посылает мне код 49214 integer или $C03E. Но что сие означает, я так и не понял. Мне кажется что это комбинация виртуальных клавиш...

upd. При смене раскладки мышью в SystemTray, приложению приходит код 45142... :-)

Последний раз редактировалось WanderAlone, 01.11.2011 в 15:08.
Ответить с цитированием
  #4  
Старый 01.11.2011, 15:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

What broke the input language messages?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 01.11.2011, 17:01
WanderAlone WanderAlone вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock

Все оказалось не просто и я окончательно запутался.
Автор статьи предлагает использовать интерфейс ITfLanguageProfileNotifySink для получения ссобщейни об изменении языкового профайла. Окунувшись в MSDN, узнаем, что для этого нам необходимо получить объект от ITfSource, который, ы свою очередь мы получим из объекта другого интерфейса: ITfInputProcessorProfiles, путем вызова QueryInterface. Я решил начать с ITfInputProcessorProfiles. В Delphi XE2 он не реализован, к сожалению. Из того же MSDN узнаем, что получить указатель на этот интерыейс можно вызовом функции CoCreateInstance с параметром CLSID_TF_InputProcessorProfiles. Запускаем regedit и выясняем как выглядит GUID: HKEY_CLASSES_ROOT\CLSID\{33C53A50-F456-4884-B049-85FD643ECFED}.

Далее объявляю интерфейсы:

Код:
const
  { from Msctf.h }
  {$EXTERNALSYM CLSID_TF_InputProcessorProfiles}
  CLSID_TF_InputProcessorProfiles: TGUID = '{33C53A50-F456-4884-B049-85FD643ECFED}';
  SID_InProcProfiles = '{33C53A51-F456-4884-B049-85FD643ECFED}';

type
  {$EXTERNALSYM ITfInputProcessorProfiles}
  ITfInputProcessorProfiles = interface(IUnknown)
    [SID_InProcProfiles]
    function Register(const clsid: TCLSID): HRESULT; stdcall;
    function GetActiveLanguageProfile(const clsid: TCLSID;
                                      var langid: DWORD;
                                      var profile: TGUID
                                      ): HRESULT; stdcall;
  end;

И пытаюсь получить указатель:

Код:
procedure MyProc(Sender: TObject);
var
  Status: HRESULT;
  FLangId: DWORD;
  FProfile: TGUID;
  tfipProfiles: ITfInputProcessorProfiles ;
begin
  Coinitialize(nil);
  tfipProfiles := nil;
  Status := CoCreateInstance(CLSID_TF_InputProcessorProfiles,
                             nil,
                             CLSCTX_INPROC_SERVER,
                             ITfInputProcessorProfiles,
                             tfipProfiles);
  if Status = S_OK then
    try
      tfipProfiles.Register(CLSID_TF_InputProcessorProfiles);
    finally
      tfipProfiles._Release;
    end;
end;

И ничего не получаю :-( То есть Status равен каком-то огромному отрацательному числу.
Может быть кто-нить подскажет, что я делаю не так?

Последний раз редактировалось WanderAlone, 03.11.2011 в 06:10.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter