Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
Turbo Delphi für Win32
|
Re: Maus- und Tastaturrecorder
28. Aug 2005, 16:59
hi,
@glkgereon:
das geht leider nur per dll (soviel ich weis, wenns nicht stimmt bitte berichtigt mich).
wenn du einen hook im programm drin machst dann gilt er nur für das programm, d.h. du kriegst keine tastatur rückgaben wenn das fenster des programms nicht aktiv ist. wenn du aber den hook in einer dll datei anwendest wird er systemweit ausgeführt und die tastaturrückgabe funktioniert immer, egal welches programm gerade aktiv ist.
quellcode der keyhook- dll
Delphi-Quellcode:
library KeyHook;
uses
Windows,
Messages;
{$R *.res}
type
PHWND = ^HWND;
const
WM_KEYBOARD_HOOK = WM_USER + 52012;
var
hHook: LongWord = 0;
Key: Word;
KeyboardLayout: HKL;
GetShiftKeys: Boolean;
hWndBuffer: PHWND;
hMMF: THandle;
function KeyboardProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
LastKey: Char;
KeyState: TKeyboardState;
begin
Result := CallNextHookEx(hHook, nCode, wParam, lParam);
if nCode < 0 then Exit;
KeyboardLayout := GetKeyboardLayout(0);
GetKeyboardState(KeyState);
if ToAsciiEx(wParam, MapVirtualKeyEx(wParam, 2, KeyboardLayout), KeyState, @LastKey, 0, KeyboardLayout) > 0 then
Key := Ord(LastKey)
else
Key := wParam;
if ((lParam and $80000000) = 0) and (not (wParam in [16, 17, 18]) or GetShiftKeys) then
PostMessage(hwndBuffer^, WM_KEYBOARD_HOOK, Key, GetActiveWindow);
end;
function Key_CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall;
var
bHWND: PHWND;
begin
hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT, 0, SizeOf(hWnd), 'EDO-SoftKeyHookHandle');
bHWND := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, SizeOf(HWND));
bHWND^ := hWnd;
UnmapViewOfFile(bHWND);
GetMem(hWndBuffer, SizeOf(HWND));
hWndBuffer^ := hWnd;
GetShiftKeys := ShiftKeys;
if hHook = 0 then
hHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0);
Result := hHook <> 0;
end;
function Key_DeleteHook: Boolean; stdcall;
begin
FreeMem(hWndBuffer);
CloseHandle(hMMF);
Result := UnhookWindowsHookEx(hHook);
hHook := 0;
end;
exports
Key_CreateHook,
Key_DeleteHook;
var
MMF: THandle;
begin
MMF := OpenFileMapping(FILE_MAP_READ, false, 'EDO-SoftKeyHookHandle');
if MMF <> 0 then
begin
hWndBuffer := MapViewOfFile(MMF, FILE_MAP_READ, 0, 0, SizeOf(HWND));
CloseHandle(MMF);
end;
end.
quellcode der maushook dll:
Delphi-Quellcode:
library MouseHook;
uses
Windows,
Messages;
{$R *.res}
type
PHWND = ^HWND;
const
WM_MOUSE_HOOK = WM_USER + 52013;
var
hHook: LongWord = 0;
hWndBuffer: PHWND;
hMMF: THandle;
function MouseProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
P: TPoint;
begin
Result := CallNextHookEx(hHook, nCode, wParam, lParam);
if nCode < 0 then Exit;
GetCursorPos(P);
P.Y := P.Y;
PostMessage(hwndBuffer^, WM_MOUSE_HOOK, P.X, P.Y);
end;
function Mouse_CreateHook(hWnd: HWND): Boolean; stdcall;
var
bHWND: PHWND;
begin
hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT, 0, SizeOf(hWnd), 'EDO-SoftMouseHookHandle');
bHWND := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, SizeOf(HWND));
bHWND^ := hWnd;
UnmapViewOfFile(bHWND);
GetMem(hWndBuffer, SizeOf(HWND));
hWndBuffer^ := hWnd;
if hHook = 0 then
hHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, hInstance, 0);
Result := hHook <> 0;
end;
function Mouse_DeleteHook: Boolean; stdcall;
begin
FreeMem(hWndBuffer);
CloseHandle(hMMF);
Result := UnhookWindowsHookEx(hHook);
hHook := 0;
end;
exports
Mouse_CreateHook,
Mouse_DeleteHook;
var
MMF: THandle;
begin
MMF := OpenFileMapping(FILE_MAP_READ, false, 'EDO-SoftMouseHookHandle');
if MMF <> 0 then
begin
hWndBuffer := MapViewOfFile(MMF, FILE_MAP_READ, 0, 0, SizeOf(HWND));
CloseHandle(MMF);
end;
end.
der quellcode stammt nicht vollständig von mir ich hab ihn irgendwo rausgenommen und ein bischen optimiert (was ich vielleicht nochmal tun sollte...) kann gut sein dasses da bessere versionen gibt mein tastaturhook funktioniert auch nocht so richtig beispielsweise wir die nach-links taste als %-zeichen ausgegeben und ein anschlag auf der f1 taste wird als "p" ausgegeben.
ps: sorry wegen der verspäteten antwort, war auf ->rock am see
-dominik
|