![]() |
Problem mit Mousehook
Hi Leute,
ich schreibe grade einen Mousehook, aber irgendwie kommen die Nachrichten aus der DLL nicht bei meinem Programm an. Hier seht ihr die DLL und das Hauptprogramm:
Delphi-Quellcode:
Und hier das Programm:
library MHDLL;
uses Windows, Messages; procedure InstallHook(AppHandle: HWND); export; forward; procedure UninstallHook; export; forward; type THookRec = record AppHnd: HWND; end; var PHookRec: ^THookRec; hApp, hMap, hMouseHook: HWND; const WM_MOUSEHOOK = WM_USER + 1001; function MouseHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(hMouseHook, Code, wParam, lParam); if Code >= 0 then begin hMap := OpenFileMapping(FILE_MAP_WRITE, False, 'MouseMMF'); PHookRec := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); if PHookRec <> nil then hApp := PHookRec.AppHnd; PostMessage(hApp, WM_MOUSEHOOK, wParam, lParam); end else Exit; end; procedure InstallHook(AppHandle: HWND); export; begin hMouseHook := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance, 0); if hMouseHook > 0 then begin hMap := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookRec), 'MouseMMF'); PHookRec := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); PHookRec.AppHnd := AppHandle; hApp := AppHandle; end; end; procedure UninstallHook(); export; begin UnhookWindowsHookEx(hMouseHook); end; procedure EntryPointProc(Reason: Integer); begin case reason of DLL_PROCESS_ATTACH: begin hMap := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookRec), 'MouseMMF'); PHookRec := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); end; DLL_PROCESS_DETACH: begin try UnMapViewOfFile(PHookRec); CloseHandle(hMap); except end; end; end; end; exports InstallHook, UninstallHook; begin DllProc := @EntryPointProc; EntryPointProc(DLL_PROCESS_ATTACH); end.
Delphi-Quellcode:
unit UMain;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WM_MOUSEHOOK = WM_USER + 1001; type TCreateHook = procedure (hApp: HWND); TDeleteHook = procedure (); type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure DLLMessage(var Msg: TMessage); message WM_MOUSEHOOK; procedure CreateHook(); procedure DeleteHook(); end; var Form1: TForm1; hLib: HWND; const MHDLL = 'MHDLL.Dll'; implementation {$R *.DFM} procedure TForm1.DLLMessage(var Msg: TMessage); begin case Msg.wParam of WM_MOUSEMOVE: begin Label1.Caption := InttoStr(LOWORD(Msg.wParam)); Label2.Caption := InttoStr(HIWORD(Msg.wParam)); end; end; end; procedure TForm1.CreateHook(); var Hook: TCreateHook; begin hLib := LoadLibrary(MHDLL); @Hook := GetProcAddress(hLib, 'InstallHook'); if @Hook = nil then Exit; Hook(Handle); end; procedure TForm1.DeleteHook(); var Hook: TDeleteHook; begin @Hook := GetProcAddress(hLib, 'UninstallHook'); if @Hook = nil then begin ShowMessage('DLL cannot be found'); Exit; end; FreeLibrary(hLib); end; procedure TForm1.Button1Click(Sender: TObject); begin CreateHook(); end; procedure TForm1.Button2Click(Sender: TObject); begin DeleteHook(); end; end. |
Re: Problem mit Mousehook
hMouseHook ist an dieser stelle nicht definiert,
diese Variable sollte auch in das MMF.
Delphi-Quellcode:
begin
Result := CallNextHookEx(hMouseHook, Code, wParam, lParam |
Re: Problem mit Mousehook
In der Prozedur Installhook(...) wird doch hMousehook definiert oder?
|
Re: Problem mit Mousehook
Du machst 2 Fehler, der erste ist dass du hMousehook nicht übergibst.
Ja er ist da definiert aber die Hookprozedur läuft im Speicherbeich der anderen Anwendungen = noaccess. Du musst das Handle beim ersten aufruf der Hook-Proecdure aus der MMF auslesen, oder es sonstwie übergeben Fehler 2: Du schreibst deine Daten in die MMF und postest dann eine Message an dein Hauptprog. ABER: Bis dann dein Hauptprog wieder zum zug kommt, kann ewig dauern, d.h. deine Prozedure kann schon 10x in 10 verschiedenen Prozessen aufgerufen worden sein bis die MMF mal ausgelesen wird. Du musst die Records hintereinander hängen und in deinem Hauptprog gucken wieviele (wenn überhaupt) Records vorhanden sind + diese abarbeiten. |
Re: Problem mit Mousehook
Welches Handle meinst du jetzt?
Könntest du mir bitte anhand des Quelltextes zeigen wie es richtig wäre? Danke... |
Re: Problem mit Mousehook
Könnte mir bitte jemand einen Lösungsvorschlag geben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz