Global Mouse Hook in Delphi
#1
السلام عليكم

وجدت في احدى المدونات كود للاستفادة من الزر الاوسط للماوس في الويندوز ككل.
وهو يعمل بشكل ممتاز بإستثناء بعض البرامج مكتوبة بلغة Visual C++

اولا ملف DLL
كود :
[COLOR=#000000]library MiddleButton; [/COLOR][COLOR=#0000ff]uses[/COLOR][COLOR=#000000] Windows, Messages; [/COLOR][COLOR=#0000ff]const[/COLOR][COLOR=#000000] MemMapFile [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]Igor_thief[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]type[/COLOR][COLOR=#000000] PDLLGlobal [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] ^TDLLGlobal; TDLLGlobal [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#0000ff]packed[/COLOR][COLOR=#0000ff]record[/COLOR][COLOR=#000000] HookHandle: HHOOK; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]var[/COLOR][COLOR=#000000] GlobalData: PDLLGlobal; MMF: THandle; [/COLOR][COLOR=#008000]{[/COLOR][COLOR=#008000]$R *.res[/COLOR][COLOR=#008000]}[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]function[/COLOR][COLOR=#000000] HookProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; [/COLOR][COLOR=#0000ff]var[/COLOR][COLOR=#000000] CurrWND: THandle; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] Code [/COLOR][COLOR=#000000]<[/COLOR][COLOR=#800080]0[/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] Result :[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] CallNextHookEx(GlobalData^.HookHandle, Code, wParam, lParam); exit; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#000000]//[/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] (wParam [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] WM_NCMBUTTONDOWN) [/COLOR][COLOR=#0000ff]or[/COLOR][COLOR=#000000] (wParam [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] WM_MBUTTONDOWN) [/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] CurrWND :[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] PMouseHookStruct(lParam)^.hwnd; CurrWND :[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] GetAncestor(CurrWND, GA_ROOTOWNER); SendMessage(CurrWND, WM_SYSCOMMAND, SC_MINIMIZE, [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000]); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#000000]//[/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] Result :[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] CallNextHookEx(GlobalData^.HookHandle, Code, wParam, lParam); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] CreateGlobalHeap; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] MMF:[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] CreateFileMapping(INVALID_HANDLE_VALUE, [/COLOR][COLOR=#0000ff]nil[/COLOR][COLOR=#000000], PAGE_READWRITE, [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], SizeOf(TDLLGlobal), MemMapFile); [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] MMF [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#800080]0[/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] MessageBox([/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]CreateFileMapping -[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800000]''[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000]); exit; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; GlobalData:[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] MapViewOfFile(MMF, FILE_MAP_ALL_ACCESS, [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], SizeOf(TDLLGlobal)); [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] GlobalData [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#0000ff]nil[/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] [/COLOR][COLOR=#000000]//[/COLOR][COLOR=#000000] ***1085;***1077; ***1089;***1084;***1086;***1075;***1076;***1080; ***1089;***1086;***1079;***1076;***1072;***1090;***1100; ***1086;***1090;***1086;***1073;***1088;***1072;***1078;***1077;***1085;***1080;***1077; CloseHandle(MMF); MessageBox([/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]MapViewOfFile -[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800000]''[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000]); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] DeleteGlobalHeap; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] GlobalData[/COLOR][COLOR=#000000]<>[/COLOR][COLOR=#0000ff]nil[/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] UnmapViewOfFile(GlobalData); [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] MMF[/COLOR][COLOR=#000000]<>[/COLOR][COLOR=#000000] INVALID_HANDLE_VALUE [/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] CloseHandle(MMF); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] RunHook; stdcall; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] GlobalData^.HookHandle:[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] SetWindowsHookEx(WH_MOUSE, @HookProc, HInstance, [/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000]); [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] GlobalData^.HookHandle [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] INVALID_HANDLE_VALUE [/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] MessageBox([/COLOR][COLOR=#800080]0[/COLOR][COLOR=#000000], [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]Error :)[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000] , [/COLOR][COLOR=#800000]''[/COLOR][COLOR=#000000] , MB_OK); Exit; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] KillHook; stdcall; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]if[/COLOR][COLOR=#000000] (GlobalData[/COLOR][COLOR=#000000]<>[/COLOR][COLOR=#0000ff]nil[/COLOR][COLOR=#000000]) [/COLOR][COLOR=#0000ff]and[/COLOR][COLOR=#000000] (GlobalData^.HookHandle[/COLOR][COLOR=#000000]<>[/COLOR][COLOR=#000000]INVALID_HANDLE_VALUE) [/COLOR][COLOR=#0000ff]then[/COLOR][COLOR=#000000] UnhookWindowsHookEx(GlobalData^.HookHandle); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] DLLEntry(dwReason: DWORD); [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]case[/COLOR][COLOR=#000000] dwReason [/COLOR][COLOR=#0000ff]of[/COLOR][COLOR=#000000] DLL_PROCESS_ATTACH: CreateGlobalHeap; DLL_PROCESS_DETACH: DeleteGlobalHeap; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; exports KillHook, RunHook; [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] DLLProc:[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] @DLLEntry; DLLEntry(DLL_PROCESS_ATTACH); [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000].[/COLOR]
طريقة الاستخددام في دلفي

كود :
[COLOR=#0000ff]unit[/COLOR][COLOR=#000000] RunMiddleButton; [/COLOR][COLOR=#0000ff]interface[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]uses[/COLOR][COLOR=#000000] Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; [/COLOR][COLOR=#0000ff]type[/COLOR][COLOR=#000000] TfrmMain [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000] class(TForm) btnRunHook: TButton; btnKillHook: TButton; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] btnRunHookClick(Sender: TObject); [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] btnKillHookClick(Sender: TObject); private [/COLOR][COLOR=#008000]{[/COLOR][COLOR=#008000] Private declarations [/COLOR][COLOR=#008000]}[/COLOR][COLOR=#000000] public [/COLOR][COLOR=#008000]{[/COLOR][COLOR=#008000] Public declarations [/COLOR][COLOR=#008000]}[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] RunHook; stdcall; external [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]MiddleButton.dll[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000] name [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]RunHook[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] KillHook; stdcall; external [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]MiddleButton.dll[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000] name [/COLOR][COLOR=#800000]'[/COLOR][COLOR=#800000]KillHook[/COLOR][COLOR=#800000]'[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]var[/COLOR][COLOR=#000000] frmMain: TfrmMain; [/COLOR][COLOR=#0000ff]implementation[/COLOR][COLOR=#000000] [/COLOR][COLOR=#008000]{[/COLOR][COLOR=#008000]$R *.dfm[/COLOR][COLOR=#008000]}[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] TfrmMain.btnRunHookClick(Sender: TObject); [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] RunHook; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]procedure[/COLOR][COLOR=#000000] TfrmMain.btnKillHookClick(Sender: TObject); [/COLOR][COLOR=#0000ff]begin[/COLOR][COLOR=#000000] KillHook; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]; [/COLOR][COLOR=#0000ff]end[/COLOR][COLOR=#000000]. [/COLOR]

اتمنى ممن لديه فكرة عن كيفية تعديل هذا الكود ليعمل مع كل النوافذ والبرامج
افادتنا
ولكم الشكر
الرد


الردود في هذا الموضوع
Global Mouse Hook in Delphi - بواسطة m.rabee - 06-09-2010, 09:32 PM
Global Mouse Hook in Delphi - بواسطة TF6M - 06-09-2010, 09:50 PM
Global Mouse Hook in Delphi - بواسطة kachwahed - 06-09-2010, 11:40 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم