Hook a sprawa kontrolki

Odpowiedz Nowy wątek
2006-08-19 21:05
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 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?


My jsme Borg. Odpor je marny, budete analovani

Pozostało 580 znaków

2008-10-06 15:04
sraczka
0

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

Pozostało 580 znaków

2008-10-06 16:07
sraczka
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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