По-моему код хука уже 3й раз на этом форуме выкладываю.
Код:
library MouseHook;
uses Windows, Messages;
type msgStruct=record
pt:TPOINT;
mouseData:DWORD;
flags:DWORD;
time:DWORD;
dwExtraInfo:ULONG_PTR;
end;
Pstruct=^msgStruct;
var
HookHandle: hHook = 0;
wnd:Hwnd = 0;
Check:boolean = false;
hMWindow:hwnd = 0;
function MouseProc(Code: integer; wParam: longint; lParam: Pstruct): longint; stdcall;
var point:TPoint;
fl:boolean;
begin
fl:=false;
if Check then begin
if code=HC_ACTION then
if wparam=WM_LBUTTONDOWN then
begin
check:=false;
fl:=true;
point:=lparam^.pt;
wnd:=WindowFromPoint(point);
end;
end;
if fl then result:=1
else result:=CallNextHookEx(0, Code, wParam, longword(lParam));
end;
// установка, отключение ловушки
procedure RunStopHook(lRun:byte; hMainWindow:hwnd); export; stdcall;
begin
if lRun=0 then begin
hMWindow:=hMainWindow;
HookHandle:=SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, hInstance, 0);
end
else if lrun=1 then
begin
UnhookWindowsHookEx(HookHandle);
HookHandle:=0;
end
else if lrun=2 then
check:=boolean(1-byte(check));
end;
function Return(State:boolean):hWnd; export; stdcall;
begin
if state then begin //что делаем, поиск окна или инициализацию
if not check then begin //если уже был клик
if wnd<>0 then
result:=wnd
else result:=$FFFFFFFF; //ошибка
end
else result:=$0; //не было клика
end
else //инициализация
wnd:=0;
end;
exports RunStopHook index 1;
exports Return Index 2;
begin
end.
и работа с ним:
Код:
//при создании формы
RunStopHook(0, handle);
...
//при закрытии формы
RunStopHook(1, handle);
...
// когда надо найти окно, на которое кликнет юзер
Return(false); // обнулим переменную окна
RunStopHook(2, handle); // сигнал, что надо поймать следующий клик
H := 0;
while H = 0 do
begin
application.ProcessMessages;
H := Return(true);
end;
...
после всех этих махинаций в H будет хэндл окна.
З.Ы. если ткнули на кнопку - соответсвенно хэндл кнопки.