Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.23;
Скачать: CL | DM;

Вниз

Как поставить глобальный хук на смену языка ввода под NT?   Найти похожие ветки 

 
Дремучий ©   (2003-10-24 12:52) [0]

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


 
Игорь Шевченко ©   (2003-10-24 12:53) [1]

А язык вообще-то меняется для каждого приложения независимо...Аналог internat пишешь ? Так в сети исходников навалом..


 
Дремучий ©   (2003-10-24 13:10) [2]


> Аналог internat пишешь ?

да, под XP надо.


> Так в сети исходников навалом..

угу, валом. Для отслеживания в рамках приложения.
Для глобальной слежки ставится таймер и отлеживается состояние текущей(уже смененной) раскладки. ИМХО, это изврат.

Я эксперементировал с HSHELL_LANGUAGE и WM_INPUTLANGCHANGE,
но к желаемого результата, увы, не достиг.


 
Дремучий ©   (2003-10-24 13:48) [3]


> А язык вообще-то меняется для каждого приложения независимо...

я это понял, только ведь когда идет переключение с приложения на приложение должно же посылаться какое-то сообщение операционке которое воссанавливает тот язык, который был выбран для того приложения, на которое мы переключились? Так вот что и где именно нужно ловить?


 
Song ©   (2003-10-24 13:57) [4]

WM_INPUTLANGCHANGEREQUEST ?


 
Дремучий ©   (2003-10-24 14:14) [5]


> Song ©

а где ставить перехват? так что ли?

unit langconst;
interface
const
MsgFromDLL = "Message from idlehook.dll";
WM_MYLANGHOOK = WM_USER + 1;

implementation
end.


library langhook;
uses
Windows,
Messages,
Classes;

var
MyAppWnd: HWND;
LangSysHook: HWND;

{$include "langconst.pas"}
{$R *.RES}

//function ShellProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
function WindowProc(hwnd: HWND; uMsg:UINT; wParam: word; lParam: longint): longint; stdcall;
begin

{
if code < 0
then begin
Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
Exit;
end;
}

//


 
Song ©   (2003-10-24 14:20) [6]

А почему хук у тебя на WH_CALLWNDPROC?


 
Дремучий ©   (2003-10-24 14:41) [7]

а в каком из
WH_SHELL WH_CALLWNDPROC WH_GETMESSAGE
перехватывается WM_INPUTLANGCHANGEREQUEST ?


 
Song ©   (2003-10-24 14:47) [8]

:) Простейший способ прочитать по ним хэлп.
Я бы даже по названию понял.


 
Игорь Шевченко ©   (2003-10-24 14:51) [9]


> я это понял, только ведь когда идет переключение с приложения
> на приложение должно же посылаться какое-то сообщение операционке
> которое воссанавливает тот язык, который был выбран для
> того приложения, на которое мы переключились?


Не должно. Текущая раскладка клавиатуры - это атрибут процесса.
Сообщение WM_INPUTLANGCHANGE.... посылается текущему приложению переднего плана. Сообщение посылается оболочке, чтобы она отобразила нужную раскладку на индикаторе клавиатуры.
Тебе имеет смысл сделать hook WM_SHELL


 
Игорь Шевченко ©   (2003-10-24 14:54) [10]

Пардон, WH_SHELL


 
Дремучий ©   (2003-10-24 15:28) [11]


> Игорь Шевченко © (24.10.03 14:54) [10]
> Пардон, WH_SHELL

делал, с него и начинал.
WH_SHELL >> HSHELL_LANGUAGE

library langhook;
uses
Windows,
Messages,
Classes;

var
MyAppWnd: HWND;
LangSysHook: HWND;
WM_MYLANGHOOK: cardinal;
const
MsgFromDLL = "Message from idlehook.dll";

{$R *.RES}

function ShellProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
begin
if code < 0
then begin
Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
Exit;
end;

//посылаем сообщение приложению из длл
if (code = HSHELL_LANGUAGE)
then begin
SendMessage(MyAppWnd, WM_MYLANGHOOK, wParam, lParam);//AppWnd
end;

Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
end;

{Процедура установки HOOK-а}
procedure HookProc(Active: boolean; hMainProg: HWND) export; stdcall;
begin
if Active
then begin
MyAppWnd:= hMainProg;
LangSysHook:= SetWindowsHookEx(WH_SHELL, @ShellProc, HInstance, 0); //WH_SHELL WH_CALLWNDPROC WH_GETMESSAGE ShellProc
if LangSysHook = 0
then MessageBox(0, "Lang-HOOK установить не удалось !", MsgFromDLL, 0)
else MessageBox(0, "Lang-HOOK установлен! ", MsgFromDLL, 0);
end
else begin
if not UnhookWindowsHookEx(LangSysHook)
then MessageBox(0, "Lang-HOOK снять не удалось !", MsgFromDLL, 0)
else MessageBox(0, "Lang-HOOK снят! ", MsgFromDLL, 0);;
end;
end;

exports HookProc;

begin
{регестрируем свой тип сообщения в системе}
WM_MYLANGHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");
end.


а в самой проге:

procedure TfmMain.WndProc(var Msg: TMessage);
begin
{Но если пришло моё сообщение - выполняем следующий код}
if Msg.Msg = WM_MYLANGHOOK
then begin
fmMain.kbdLayout.SetHKL(Msg.lParam);
if (Msg.Msg = WM_MYLANGHOOK) then MessageBox(0, "WM_MYLANGHOOK!", MsgFromDLL, 0);
end;

//выполняем всё то, что должно происходить при поступлении сообщеня окну
inherited;
end;

initialization
{регестрируем свой тип сообщения в системе}
WM_MYLANGHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");
finalization


В фаре(консольное приложение) работает, в других прогах - нет. Хуки ставятся нормально. А вот месага почему-то не доходит... Почему?


 
Игорь Шевченко ©   (2003-10-24 15:30) [12]

Я не совсем понял, какую задачу ты хочешь решить, давай плясать от условия


 
Дремучий ©   (2003-10-24 15:40) [13]

мне нужен индикатор текущего языка ввода(раскладки клавиатуры) - аналог internat под XP.


 
Дремучий ©   (2003-10-24 15:56) [14]

может, я неправильно определяю адресата ссобщения?

в проге ставил
hook(true, fmMain.Handle);//главная прога
hook(true, Application.Handle);


в ддл >>
MyAppWnd:= hMainProg;
SendMessage(MyAppWnd, WM_MYLANGHOOK, wParam, lParam);//AppWnd


 
Игорь Шевченко ©   (2003-10-24 16:49) [15]

Дремучий © (24.10.03 15:40)


> мне нужен индикатор текущего языка ввода(раскладки клавиатуры)
> - аналог internat под XP.


Для любого приложения ? Ищи, в google где-то был пример. В XP, кстати, уже есть индикатор, чем он тебе не нравится ?


 
Дремучий ©   (2003-10-24 17:04) [16]


> Для любого приложения ? Ищи, в google где-то был пример.
> В XP, кстати, уже есть индикатор, чем он тебе не нравится
> ?

1)тем, что он "слетел", и восстановить его не получается (в меню отсутствует, в настройках кнопка для настройки индикатора недоступна).
2)вопрос написания своего индикатора перерос в обычного в принципиальный


 
Дремучий ©   (2003-10-24 18:02) [17]

HSHELL_LANGUAGE - только для Win95. И что дальше?


 
Дремучий ©   (2003-10-24 18:46) [18]

так как поставить глобальный хук на
WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?


 
DVM ©   (2003-10-24 20:36) [19]


> HSHELL_LANGUAGE - только для Win95. И что дальше?

Не только. По крайней мере в XP работает!


 
Дремучий ©   (2003-10-27 16:46) [20]


> DVM © (24.10.03 20:36) [19]
> > HSHELL_LANGUAGE - только для Win95. И что дальше?
> Не только. По крайней мере в XP работает!

ага, работает. Если ставить хук в проге(локальный).
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=13726

а если ставишь в длл(глобальный) - наблюдаем большую фигу.
http://firststeps.narod.ru/winapi/hook/36.html
да и во многих других источниках:
HSHELL_LANGUAGE - Только для Windows 95: язык клавиатуры был изменен, или была загружена новая раскладка символов на клавиатуре.


 
DVM ©   (2003-10-27 18:15) [21]


> HSHELL_LANGUAGE - Только для Windows 95: язык клавиатуры
> был изменен, или была загружена новая раскладка символов
> на клавиатуре.

И глобально из длл все тоже нормально ловится. В данном случае "только 95" означает, что не 3.11.


 
Song ©   (2003-10-28 12:44) [22]

>>так как поставить глобальный хук на
>>WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?

WH_GETMESSAGE пробовал? Не вижу причины почему не должно так отлавливать. Если я не прав, пусть коллеги подправят.


 
Дремучий ©   (2003-10-29 11:55) [23]


> В данном случае "только 95" означает, что не 3.11.

блин, отстойно написано. Не могли написать Win32?



Страницы: 1 вся ветка

Текущий архив: 2003.12.23;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.018 c
14-75404
Фагот
2003-11-27 11:07
2003.12.23
Сертификация


11-75134
Юрий
2003-04-08 19:06
2003.12.23
Модальная форма


1-75154
Alex-chainik
2003-12-10 14:41
2003.12.23
Две формы


14-75345
Шишкин Илья
2003-11-30 15:24
2003.12.23
TMEMO и др.


14-75344
Great DAN
2003-11-30 00:13
2003.12.23
Как всавить музыку!