Announcement

Collapse
No announcement yet.

Windowsweit Koordinaten von Mausklicks auswerten...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windowsweit Koordinaten von Mausklicks auswerten...

    Also - ich habe folgendes Problem:

    Ich will Windowsweit die Koordinaten aller Klicks mit der linken bzw rechten (getrennt behandelt) Maustaste durch mein Programm in einer Datei speichern lassen.

    Ich hab so ne Ahnung wie das über einen Hook geht -> komme aber dann mit der Auswertung der Daten nicht klar...

    Im folgenden ist mein komplettes Programm mit der Stelle markiert, wo ich nicht mehr weiter komme...

    1. Ich habe da zum einen eine DLL :

    <I>library MouseHook;

    uses
    SysUtils,
    Classes,
    Windows,
    Messages;

    const
    CM_HOOK = WM_USER + $1000;

    var
    MyMouseHook: HHook;
    TargetHandle: THandle;
    TargetPointer: ^Integer;

    function MouseHookEvent(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

    begin
    if Code = HC_ACTION then
    begin
    TargetHandle := OpenFileMapping(FILE_MAP_READ, False, 'MouseHookUser');
    if TargetHandle <> 0 then
    begin
    TargetPointer := MapViewOfFile(TargetHandle, FILE_MAP_READ, 0, 0, 0);
    PostMessage(TargetPointer^, CM_HOOK, wParam, lParam);
    UnmapViewOfFile(TargetPointer);
    CloseHandle(TargetHandle);
    end;
    end;
    Result := CallNextHookEx(MyMouseHook, Code, wParam, lParam);
    end;

    procedure HookOn; stdcall;

    begin
    MyMouseHook := SetWindowsHookEx(WH_MOUSE, @MouseHookEvent, HInstance, 0);
    end;

    procedure HookOff; stdcall;

    begin
    UnhookWindowsHookEx(MyMouseHook);
    end;

    exports

    HookOn, HookOff;

    begin
    end.</I>

  • #2
    2. und ein Programm, das dies in einem Memo-Feld darstellen soll :

    <CODE>unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    const
    DLLName = 'MouseHook.dll';
    CM_HOOK = WM_USER + $1000;

    type
    TMyMouseHook = procedure; stdcall;

    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    private
    { Private-Deklarationen }
    HookHandle: THandle;
    HookPointer: ^Integer;
    HandleDLL: THandle;
    HookOn, HookOff: TMyMouseHook;
    procedure MouseHookCalling(var Message: TMessage); message CM_HOOK;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);

    begin
    Memo1.ReadOnly := True;
    HandleDLL := LoadLibrary(PChar(ExtractFilePath(Application.Exen ame) + DLLName));
    if HandleDLL = 0 then
    raise Exception.Create('DLL kann nicht geladen werden !');
    @HookOn := GetProcAddress(HandleDLL, 'HookOn');
    @HookOff := GetProcAddress(HandleDLL, 'HookOff');
    if not assigned(HookOn) or not assigned(HookOff) then
    raise Exception.Create('DLL-Funktionen können nicht geladen werden !');
    HookHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(Integer), 'MouseHookUser');
    if HookHandle = 0 then
    raise Exception.Create('Fehler beim Schreiben der Datei !');
    HookPointer := MapViewOfFile(HookHandle, FILE_MAP_WRITE, 0, 0, 0);
    HookPointer^ := Handle;
    HookOn;
    end;

    procedure TForm1.MouseHookCalling(var Message: TMessage);

    begin
    <B>// WIE KANN ICH HIER DIE AUSGABE DER KOORDINATEN UND DER GEDRÜCKTEN
    // MAUSTASTE (WENN DER FALL) AUF MEIN MEMO REALISIEREN ???</B>
    end;

    procedure TForm1.FormDestroy(Sender: TObject);

    begin
    if Assigned(HookOff) then HookOff;
    if HandleDLL <> 0 then
    FreeLibrary(HandleDLL);
    if HookHandle <> 0 then
    begin
    UnmapViewOfFile(HookPointer);
    CloseHandle(HookHandle);
    end;
    end;

    end.</CODE>

    Vielen Dank schon mal - Matthia

    Comment


    • #3
      Hi

      Schaul mal in der WINAPI Hilfe nach:
      SetWindowsHookEx(), WH_MOUSE und MouseProc().
      Dein MMF sendet die MouseHook Message weiter an Deine Anwendung. D.h.
      die Parameter Message.wParam und Message.lParam von MouseHookCalling()
      enthalten die gleichen Werte wie die von MouseHook().

      Gruß Hage

      Comment


      • #4
        Kannst du mir das bitte konkret als Quelltext zeigen - in der Form :

        Memo1.Lines.Appen('X-Wert: ', ???, ' Y-Wert: ', ???, ' gedrückte Taste : ', ???);

        Vielen Dank schon mal - Matthias - [email protected]

        Comment

        Working...
        X