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!