PDA

View Full Version : راهنمایی در رابطه با hook



AliReza Vafakhah
چهارشنبه 07 بهمن 1394, 00:53 صبح
سلامی دوباره خدمت دوستان

میخوام تمام رویدادهای موس رو هوک کنم و مشکل اینجاست که با کد زیر فقط پروسه خود برنامه هوک میشه (در صورت به کار بردن GetCurrentThreadId) وقتی هم بجای GetCurrentThreadIdصفر میگذارم که کل ویندوز زو هوک کنه در ویندوز 10 که هیچ اتفاقی نمی افته ولی در ویندوز xp کد کار میکنه اما پروسه Explorer پیغام خطا میده.

دوستان ممنون میشم راهنمایی کنید

unit Unit1;


interface


uses
Winapi.Windows, System.SysUtils,
System.Classes,
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls;


type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


function myHookProc(code: Integer; wParam, lParam: LongInt)
: NativeUInt; stdcall;


var
Form1: TForm1;
myHook: hHook;


implementation


function myHookProc(code: Integer; wParam, lParam: LongInt): NativeUInt;
var
X, Y: Integer;


begin
X := PMouseHookStruct(lParam).pt.X;
Y := PMouseHookStruct(lParam).pt.Y;
Form1.Label1.Caption := IntToStr(X) + ' : ' + IntToStr(Y);


Form1.Caption := IntToStr(wParam);


result := CallNextHookEx(myHook, code, wParam, lParam);
end;


{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
if (myHook <= 0) then
begin
// myHook := SetWindowsHookEx(WH_MOUSE, @myHookProc, HInstance,
// GetCurrentThreadId);


myHook := SetWindowsHookEx(WH_MOUSE, @myHookProc, HInstance,
0);
end;


end;


procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(myHook);
myHook:= 0;
end;


end.


138674

بهروز عباسی
چهارشنبه 07 بهمن 1394, 09:33 صبح
سلام
شما واسه wide hook باید از dll injection استفاده کنی
متدهای هوک رو توی dll پیاده سازی کن بعد اون dll رو به همه پروسس ها اینجکت کن تا هوکت کار کنه.
https://github.com/MahdiSafsafi/delphi-detours-library



ماکلا هوک کلی نداریم یه سری متدها واسه کرنل مد هست که داستان بسیار دارد !

Mask
چهارشنبه 07 بهمن 1394, 10:06 صبح
پیرو صحبتهای بهروز:
دقیقا چیه موس رو میخای هوک کنی؟
شاید اصلا هوک نیز نداشته باشی
دقیق دقیق مشکلتو بگو. راههای ساده تری هست. اغلب انتی ها inject wide رو دتکت میکنن.

AliReza Vafakhah
چهارشنبه 07 بهمن 1394, 12:48 عصر
سلام
شما واسه wide hook باید از dll injection استفاده کنی
متدهای هوک رو توی dll پیاده سازی کن بعد اون dll رو به همه پروسس ها اینجکت کن تا هوکت کار کنه.
https://github.com/MahdiSafsafi/delphi-detours-library



ماکلا هوک کلی نداریم یه سری متدها واسه کرنل مد هست که داستان بسیار دارد !

تشکر ، راه حل شما درسته و باید از هوک dll injection استفاده کنم

منظورم از هوک کلی یعنی اینکه من رویدادها موس رو فقط تو پنجره خودم برنامه ام دارم و میخواستم تو تمام پنجره ها داشته باشم


پیرو صحبتهای بهروز:
دقیقا چیه موس رو میخای هوک کنی؟
شاید اصلا هوک نیز نداشته باشی
دقیق دقیق مشکلتو بگو. راههای ساده تری هست. اغلب انتی ها inject wide رو دتکت میکنن.

داداش میخوام کلید میانی موس (Wheel) رو هرجا فشرده شد متوجه بشم و حتی اسکرول شد.

این کامپوننت عالیه ولی تمام نت رو گشت نیست که نیست
Mouse Hook (http://www.greatis.com/delphicb/mousehook/)

Mask
چهارشنبه 07 بهمن 1394, 15:21 عصر
نیاز به هوک نیست
ببین این کارتو راه میندازه.

AliReza Vafakhah
چهارشنبه 07 بهمن 1394, 15:42 عصر
نیاز به هوک نیست
ببین این کارتو راه میندازه.

خیلی ممنون و تشکر

میشه فایل پروژه رو قرار بدین؟

ولی من میخواستم رویدادهای اسکرول ، کلیدهای Back/Forward رو هم هوک کنم که خوشبختانه کامپوننتش رو گیر آورد و اینجا ضمیمه میکنم تا به کار دوستان دیگه هم امد استفاده کنند.
138682

Mask
چهارشنبه 07 بهمن 1394, 19:54 عصر
خوب بالاخره کارتون راه افتاد یا من کد قرار بدم؟

AliReza Vafakhah
چهارشنبه 07 بهمن 1394, 22:31 عصر
خوب بالاخره کارتون راه افتاد یا من کد قرار بدم؟
ممنون میشم بله قرار بدین

Mask
چهارشنبه 07 بهمن 1394, 22:43 عصر
اینتروال تایمر رو بزار 1 و کدو بنداز توش.
procedure TForm1.Timer1Timer(Sender: TObject);begin
(Sender as TTimer).Interval := 1;
if (GetAsyncKeyState(VK_LBUTTON) and $8000 <> 0) then
Memo1.Lines.Append(' Left BUTTON ');
if (GetAsyncKeyState(VK_MBUTTON) and $8000 <> 0) then
Memo1.Lines.Append(' Middle BUTTON ');
if (GetAsyncKeyState(VK_RBUTTON) and $8000 <> 0) then
Memo1.Lines.Append(' Right BUTTON ');
if ((GetAsyncKeyState(VK_CONTROL) and $8000) <> 0) then
Memo1.Lines.Append(' CONTROL BUTTON ');
end;