Hook a sprawa kontrolki

0

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?

0

no mam podobny problem ... parametr hwnd Teventmsg nie zwraca hwnd okna ..... kto qma o co be ?

0

buffer.hwnd:=GetForegroundWindow; w sumie takie cos dziala powiedzmy tak samo ... ale pytanie dlaczego Teventmsg nie przekazuje uchwytu okna !!

1 użytkowników online, w tym zalogowanych: 0, gości: 1