![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поставить глобальный хук на смену языка ввода под NT? [Win2k, WinXP]
Дремучий © (2003-10-24 12:52:00)
сабж, интересует именно глобальный хук. Потому как в пределах проги, все отлавливается нормально.
Дремучий (2003-10-29 11:55:00) [1]
> В данном случае "только 95" означает, что не 3.11.
блин, отстойно написано. Не могли написать Win32?
Song (2003-10-28 12:44:00) [2]
>>так как поставить глобальный хук на
>>WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?
WH_GETMESSAGE пробовал? Не вижу причины почему не должно так отлавливать. Если я не прав, пусть коллеги подправят.
DVM (2003-10-27 18:15:00) [3]
> HSHELL_LANGUAGE - Только для Windows 95: язык клавиатуры
> был изменен, или была загружена новая раскладка символов
> на клавиатуре.
И глобально из длл все тоже нормально ловится. В данном случае "только 95" означает, что не 3.11.
Дремучий (2003-10-27 16:46:00) [4]
> 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-24 20:36:00) [5]
> HSHELL_LANGUAGE - только для Win95. И что дальше?
Не только. По крайней мере в XP работает!
Дремучий (2003-10-24 18:46:00) [6]
так как поставить глобальный хук на
WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?
Дремучий (2003-10-24 18:02:00) [7]
HSHELL_LANGUAGE - только для Win95. И что дальше?
Дремучий (2003-10-24 17:04:00) [8]
> Для любого приложения ? Ищи, в google где-то был пример.
> В XP, кстати, уже есть индикатор, чем он тебе не нравится
> ?
1)тем, что он "слетел", и восстановить его не получается (в меню отсутствует, в настройках кнопка для настройки индикатора недоступна).
2)вопрос написания своего индикатора перерос в обычного в принципиальный
Игорь Шевченко (2003-10-24 16:49:00) [9]
Дремучий © (24.10.03 15:40)
> мне нужен индикатор текущего языка ввода(раскладки клавиатуры)
> - аналог internat под XP.
Для любого приложения ? Ищи, в google где-то был пример. В XP, кстати, уже есть индикатор, чем он тебе не нравится ?
Дремучий (2003-10-24 15:56:00) [10]
может, я неправильно определяю адресата ссобщения?
в проге ставил
hook(true, fmMain.Handle);//главная прога
hook(true, Application.Handle);
в ддл >>
MyAppWnd:= hMainProg;
SendMessage(MyAppWnd, WM_MYLANGHOOK, wParam, lParam);//AppWnd
Дремучий (2003-10-24 15:40:00) [11]
мне нужен индикатор текущего языка ввода(раскладки клавиатуры) - аналог
internatпод XP.
Игорь Шевченко (2003-10-24 15:30:00) [12]
Я не совсем понял, какую задачу ты хочешь решить, давай плясать от условия
Дремучий (2003-10-24 15:28:00) [13]
> Игорь Шевченко © (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 14:54:00) [14]
Пардон, WH_SHELL
Игорь Шевченко (2003-10-24 14:51:00) [15]
> я это понял, только ведь когда идет переключение с приложения
> на приложение должно же посылаться какое-то сообщение операционке
> которое воссанавливает тот язык, который был выбран для
> того приложения, на которое мы переключились?
Не должно. Текущая раскладка клавиатуры - это атрибут процесса.
Сообщение WM_INPUTLANGCHANGE.... посылается текущему приложению переднего плана. Сообщение посылается оболочке, чтобы она отобразила нужную раскладку на индикаторе клавиатуры.
Тебе имеет смысл сделать hook WM_SHELL
Song (2003-10-24 14:47:00) [16]
:) Простейший способ прочитать по ним хэлп.
Я бы даже по названию понял.
Дремучий (2003-10-24 14:41:00) [17]
а в каком из
WH_SHELL WH_CALLWNDPROC WH_GETMESSAGE
перехватывается WM_INPUTLANGCHANGEREQUEST ?
Song (2003-10-24 14:20:00) [18]
А почему хук у тебя на WH_CALLWNDPROC?
Дремучий (2003-10-24 14:14:00) [19]
> Song ©
а где ставить перехват? так что ли?
unit langconst;
interface
const
MsgFromDLL = "Message from idlehook.dll";
WM_MYLANGHOOK = WM_USER + 1;
implementation
end.
librarylanghook;
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 13:57:00) [20]
WM_INPUTLANGCHANGEREQUEST ?