Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
ВнизКак поставить глобальный хук на смену языка ввода под 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c