AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Mousehook

Ein Thema von Chris P · begonnen am 2. Jul 2004 · letzter Beitrag vom 5. Jul 2004
Antwort Antwort
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#1

Problem mit Mousehook

  Alt 2. Jul 2004, 09:24
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.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Problem mit Mousehook

  Alt 2. Jul 2004, 10:30
hMouseHook ist an dieser stelle nicht definiert,
diese Variable sollte auch in das MMF.
Delphi-Quellcode:
begin
   Result := CallNextHookEx(hMouseHook, Code, wParam, lParam
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Problem mit Mousehook

  Alt 2. Jul 2004, 11:11
In der Prozedur Installhook(...) wird doch hMousehook definiert oder?
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#4

Re: Problem mit Mousehook

  Alt 2. Jul 2004, 11:30
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.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Problem mit Mousehook

  Alt 2. Jul 2004, 11:37
Welches Handle meinst du jetzt?

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

Danke...
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Problem mit Mousehook

  Alt 5. Jul 2004, 11:41
Könnte mir bitte jemand einen Lösungsvorschlag geben?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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