Форум: "WinAPI";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
ВнизКак определить что был сделан click из глобальной ловушки. Найти похожие ветки
← →
AFROLOV (2002-04-01 17:06) [0]Subj.
Заранее спасибо.
← →
AFROLOV (2002-04-01 17:08) [1]Извените, забыл сказать, что на левую клавишу мыши.
← →
Виктор Щербаков (2002-04-01 17:19) [2]Я конечно не пробовал, но идея есть:
Должны придти 2 сообщения WM_LBUTTONDOWN и WM_LBUTTONUP.
Причем указатель мыши должен находиться над одним и тем же элементом управления. Это можно выяснить с помощью WindowFromPoint. Но работать будет только для оконных элементов управления. Т.е. для SpeedButton, например, не будет правильно работать.
← →
Виктор Щербаков (2002-04-01 17:22) [3]Вышесказанное относится к хуку на мышь. Если речь о WH_CALLWNDPROC, то решение тривиально.
← →
Fellomena (2002-04-02 10:34) [4]
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 придётся (для корректности) передавать дескриптор хука, который должен быть сохранён где-либо, например, отображён в своп
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c