Witajta. Przeanalizowałem kawałek kodu zacnego Adama Boducha odnośnie komunikatów:
function KeyboardHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
var
Buffer : TEventMsg; // deklaracja struktury
Wnd : array[0..255] of char;
procedure TranslateKey(Key : Byte);
begin
with MainForm do
begin
case Key of
13: Memo.Lines.Add('');
8: Memo.Text := Memo.Text + '[backspace]';
27: Memo.Text := Memo.Text + '[esc]';
else Memo.Text := Memo.Text + Chr(Key);
end;
end;
end;
begin
Result := 0; // wartość zwracana przez procedure
Buffer := PEventMsg(lParam)^; // uzyskanie danych poprzez odczytanie wskaznika
if Buffer.Message = WM_KEYDOWN then { dotyczy tylko komunikatu WM_KEYDOWN }
begin
GetWindowText(Buffer.hwnd, Wnd, SizeOf(Wnd)); // pobierz tekst aktywnego okna
{ jeżeli użytkownik zapisuje dane w innym oknie }
if Wnd <> lpWnd then
begin
lpWnd := Wnd;
MainForm.Memo.Clear; // wyczyść zawartość komponentu
end;
MainForm.Label1.Caption := Format('ParamL %d, ParamW %d, Buffer.hwnd %d, Code%d, wParam %d; lParam %d',
[Buffer.paramL, Buffer.paramH, Buffer.hwnd, Code, wParam, lParam]);//dodane przez Patmana
TranslateKey(Buffer.paramL);
end;
end;
Pełny listing na http://4programmers.net/Delphi/Kompendium/Rozdział_5
Czy jest możliwość wykorzystania tej procedurki do znalezienia uchwytu kontrolki, z której pochodzi komunikat? Jest tam zawarta insynuacja, że Buffer.hwnd zawiera uchwyt do tej kontrolki, jednak po bliższym przyjrzeniu się temu, to nie ma sensu, gdyż Buffer pobierany jest ze stosu, na który wrzucane są argumenty (notabene w odwróconej kolejności), lecz nie ma tam słowa o uchwycie. Efektem jest zawsze zerowa wartość tego handle'a. W takim układzie - czy jest to tylko jakiś drobny błąd w procedurze, iż nie można dobrać się do uchwytu, czy to po prostu jest nieporozumienie z użyciem Buffer.hwnd i trzeba uzyskać uchwyt w inny sposób?