Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как поставить глобальный хук на смену языка ввода под NT? [Win2k, WinXP]


Страницы:   1 2

Дремучий ©   (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 ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо