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
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