Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit Mousehook (https://www.delphipraxis.net/25172-problem-mit-mousehook.html)

Chris P 2. Jul 2004 08:24


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:
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.
Und hier das Programm:
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.

neolithos 2. Jul 2004 09:30

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

Chris P 2. Jul 2004 10:11

Re: Problem mit Mousehook
 
In der Prozedur Installhook(...) wird doch hMousehook definiert oder?

Vjay 2. Jul 2004 10:30

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.

Chris P 2. Jul 2004 10:37

Re: Problem mit Mousehook
 
Welches Handle meinst du jetzt?

Könntest du mir bitte anhand des Quelltextes zeigen wie es richtig wäre?

Danke...

Chris P 5. Jul 2004 10:41

Re: Problem mit Mousehook
 
Könnte mir bitte jemand einen Lösungsvorschlag geben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz