Показать сообщение отдельно
  #4  
Старый 18.01.2011, 13:23
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

По-моему код хука уже 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 будет хэндл окна.
З.Ы. если ткнули на кнопку - соответсвенно хэндл кнопки.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием