|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
|||
|
|||
моно таймер и функция чтототипа ...layout... непомню точно
|
#3
|
|||
|
|||
Цитата:
Конечно, как вариант, можно и таймер повесить, который, как заведенный будет постоянно мониторить изменения раскладки, но имхо это легкий изврат :-) Может кто-то сталкивался и нашел правильный message от Win 7. Пока что: опытным путем я понял, что в момент смены раскладки винда посылает мне код 49214 integer или $C03E. Но что сие означает, я так и не понял. Мне кажется что это комбинация виртуальных клавиш... upd. При смене раскладки мышью в SystemTray, приложению приходит код 45142... :-) Последний раз редактировалось WanderAlone, 01.11.2011 в 15:08. |
#4
|
||||
|
||||
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
Цитата:
Все оказалось не просто и я окончательно запутался. Автор статьи предлагает использовать интерфейс 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. |