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

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

Как определить что был сделан 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]

Извените, забыл сказать, что на левую клавишу мыши.


Наверх

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