![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить что был сделан click из глобальной ловушки. [D6]
AFROLOV © (2002-04-01 17:06:00)Subj.
Заранее спасибо.
Fellomena (2002-04-02 10:34:00) [1]
library hook_dll;
uses Windows, Messages;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
{ данная ф-ия вызывается системой каждый раз, когда возникает какое-то событие в
dialog box-е, message box-е, menu, или scroll bar-е}
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
{ Передаём сообщение дальше по цепочке hook-ов. }
CallNextHookEx(SysHook, Code, wParam, lParam);
{ флаг code определяет тип произошедшего события. }
if code = HC_ACTION then
begin
{ В wnd кладу дескриптор того окна, которое сгенерировало сообщение.}
Wnd:=TMsg(Pointer(lParam)^).hwnd;
{ Проверяю, нажата ли правая кнопка мыши}
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
begin
{ Раскрываю окно на всю клиентскую область.}
ShowWindow(wnd, SW_MAXIMIZE);
{ Вывожу сообщение.}
MessageBox(0, "HOOK is working !", "Message", 0);
end;
end;
end;
{ Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
{ Устанавливаю HOOK, если он не установлен (switch=true). }
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
{ тут: WH_GETMESSAGE - тип hook-а ; @SysMsgProc - адрес процедуры обработки ;
HInstance - указывает на DLL, содержащую процедуру обработки hook-а; последний
параметр указывает на thread, с которым ассоциирована процедура обработки hook-а;
}
MessageBox(0, "HOOK установлен !", "Сообщение из DLL", 0);
end
else
begin
{ Снимаю HOOK, если он установлен (switch=false). }
UnhookWindowsHookEx(SysHook);
MessageBox(0, "HOOK снят !", "Сообщение из DLL", 0);
SysHook := 0;
end;
end;
exports hook;
begin
end.
Для не Win2k в CallNextHookEx придётся (для корректности) передавать дескриптор хука, который должен быть сохранён где-либо, например, отображён в своп
Виктор Щербаков (2002-04-01 17:22:00) [2]Вышесказанное относится к хуку на мышь. Если речь о WH_CALLWNDPROC, то решение тривиально.
Виктор Щербаков (2002-04-01 17:19:00) [3]Я конечно не пробовал, но идея есть:
Должны придти 2 сообщения WM_LBUTTONDOWN и WM_LBUTTONUP.
Причем указатель мыши должен находиться над одним и тем же элементом управления. Это можно выяснить с помощью WindowFromPoint. Но работать будет только для оконных элементов управления. Т.е. для SpeedButton, например, не будет правильно работать.
AFROLOV (2002-04-01 17:08:00) [4]Извените, забыл сказать, что на левую клавишу мыши.