Announcement

Collapse
No announcement yet.

Systemweiter Mousehook funktioniert nur in der Anwendung

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

  • Systemweiter Mousehook funktioniert nur in der Anwendung

    Hallo,

    ich habe eine DLL erstellt um einen Systemweiten Mousehook zu machen. Ich will jeden Mouseklick aufzeichnen.

    Folgender Code befindet sich in der DLL :

    <PRE>
    library Projectdll;

    uses
    Windows,
    Messages,
    Sysutils;

    var
    HookHandle: Cardinal = 0;
    WindowHandle: Cardinal = 0;
    f:textfile;

    function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
    LRESULT; stdcall;
    var test:string;
    begin

    case nCode < 0 of
    TRUE: exit;//wenn code kleiner 0 wird nix gemacht

    FALSE:
    begin
    if (wparam = WM_LBUTTONDOWN) or (wparam = WM_LBUTTONUP)then begin
    test:= IntToStr(wParam) +','+ IntTOStr(PMouseHookStruct(lParam).pt.X) + ':' + IntToStr(PMouseHookStruct(lParam).pt.y);
    writeln(f,test);
    end;
    end;
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
    end;

    function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
    begin
    Result := False;
    if HookHandle = 0 then begin
    //Erstmal Hook installieren

    HookHandle := SetWindowsHookEx(WH_MOUSE, @KeyboardHookProc,
    HInstance, 0);
    //Uebergebenes Fensterhandle sichern

    WindowHandle := Hwnd;
    Result := TRUE;
    assignfile(f,'C:\test.txt');
    rewrite(f);
    end;
    end;

    function UninstallHook: Boolean; stdcall;
    begin
    //Hook aus der Hookchain entfernen

    Result := UnhookWindowsHookEx(HookHandle);
    HookHandle := 0;
    closefile(f);
    end;

    exports
    //Installations- und Deinstallationsroutine exportieren

    InstallHook,
    UninstallHook;
    end.
    </PRE>

    Bei WM_LBUTTONDOWN bzw. UP wird der entsprechende Code (513 bzw 514) und die Koordinaten in C:\test.txt geschrieben.

    Solange ich die Mausklicks auf meiner Form mache funktioniert das ganze wunderbar, sobald ich aber außerhalb von meiner Form klicke passiert nix. Es kann ja eigentlich nur am installieren des Hooks liegen, aber das einzige was mir da einfällt ist die ThreadID auf 0 zu setzen, und das habe ich bereits gemacht...

    Um das ganze in einem Projekt einzusetzen muß
    <PRE>
    type
    TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
    TUninstallHook = function: Boolean; stdcall;
    </PRE>
    deklariert werden, sowie 3 entsprechende Variablen :
    <PRE>
    InstallHook: TInstallHook;
    UninstallHook: TUninstallHook;
    lib: Cardinal;
    </PRE>

    Auf meiner Form habe ich einen Button mit :
    <PRE>
    lib := LoadLibrary('projectdll.dll');
    if lib <> INVALID_HANDLE_VALUE then begin
    InstallHook := GetProcAddress(lib, 'InstallHook');
    UnInstallHook := GetProcAddress(lib, 'UninstallHook');
    end; // else ERROR
    installhook(self.Handle);
    </PRE>

    Hiermit wird die DLL geladen und der Hook installiert.

    Mit uninstallhook; wird der Hook deinstalliert, hierbei wird auch die Datei geschlossen.

    Ich hoffe mir kann hier jemand weiterhelfen ?

    mfg

    cryptic

Working...
X