Hook na nowe okna w systemie

0

Dzień dobry, chciałem założyć Hook wykrywający pojawianie
się nowych okien w systemie. Postępowałem według wskazówek
w WinSDK. CBTProc ma zwracać zero żeby zezwalać na wykonanie
tych akcji, no i jak w funkcji CBTProc mam samo Result := 0
to jest OK a jak dodaję jakiś warunek, np. taki jak poniżej
to dzieją się dziwne rzeczy, przede wszystkim żadne okno się
już nie pojawia oprócz tych które widać a przy okazji czasami
zamyka się explorer.exe i wyskakują błędy o nieprawidłowym
dojściu okna. Co robię źle ?

var
  Hook: Integer;

function CBTProc(Code: integer;
  wParam, lParam: Longint): Longint; stdcall;
begin
  Result := 0;
  if Code = HCBT_CREATEWND then
    Form1.Caption := 'Pojawiło się nowe okno';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Hook := SetWindowsHookEx(WH_CBT, CBTProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnHookWindowsHookEx(Hook);
end;
0

Dziwna sprawa, grzebie w google od rana, przeważnie znaleźć
coś można na rosyjskich stronach, mimo tego nadal rozwiązania
działającego nie widziałem. Co mam począć ? Może coś ktoś wie ?
Zachodzę w głowę czemu taka funkcja:

function CBTProc(Code: Integer;
  wParam, lParam: Longint): Longint; stdcall;
begin
  Result := 0;
end;

działa poprawnie, a taka: (i - zmienna globalna)

function CBTProc(Code: Integer;
  wParam, lParam: Longint): Longint; stdcall;
begin
  Result := 0;
  i := Code;
end;

powoduję zamknięcie wszystkich widocznych okien ?
Nie mam już siły Delphi odpalać. [glowa]
Błagam o pomoc... ;-(

0

Poszukaj o ShellHook'u (dokładniej o ShellProc) w Windows SDK.

HSHELL_WINDOWCREATED
A top-level, unowned window has been created. The window exists when the system calls a ShellProc function.

0

Poszukaj o ShellHook'u (dokładniej o ShellProc) w Windows SDK.

Oj... już miałem nadzieję ;-) ale niestety, ten Hook
potrafi zareagować jedynie na stworzenie tej aplikacji
w której działa, a jak się inne pojawiają okna to się
nic nie dzieje, albo coś źle robie ?

function ShellProc(Code: Integer;
  wParam, lParam: Longint): Longint; stdcall;
var
  Buf : Array[0..255] of char;
begin
  if Code = HSHELL_WINDOWCREATED then
  begin
    GetWindowText(wParam, Buf, 256);
    Form1.Caption := Buf;
  end;
  if Code < 0 then
    Result := CallNextHookEx(Hook, Code, wParam, lParam)
  else
    Result := 0;
end;

Swoją drogą ciekawe dlaczego ten WH_CBT nie działa ?

[dopisane]

Czy na to że WH_CBT nie działa może mieć jakiś wpływ to
że umieszczam ten kod w źródle programu, a wszystkie kody jakie
do tej pory widziałem były w jakichś zewnętrznych bibliotekach ?

0

raczej to nie jest sprawa kodu w programie bo jego wywołanie następuje praktycznie w ten sam sposób. Może po prostu spróbuj wstawić result:=0; na końcu procedurki

0

To jest właśnie specyfika hooków, że czasami kiedy próbujemy z nich samych odnieść się do elementów na zewnątrz (komponenty itd) to pojawia się błąd.

Nie wiem czy to rozwiąże problem, ale spróbuj zadeklarować jakąś zminną public i tam walnąć rozwiązanie, a następnie np timeem wywalić ją na caption formatki

0

Napisz Hook'a w bibliotece dll i zainicjuj ją z kolei z kolejengo programu exe.

0

Dopisze jeszcze coś.
Hook zainicjowqany w programie exe działa tylko gdy jest on aktywny (Hook działa tylko w tym procesie). I aby hook mógł działać poza procesem trzeba go umieścić w bibliotece dll.
Jeżeli chcesz się dowiedzieć praktycznie jak to działa napisz do mnie e'maila. Mój e'mail: [email protected]

0

Twardy: jak masz cos wartościowego do przekazania to podziel sie wiedzą na forum, pisz artykuły, gotowce, FAQ... pomożesz ludziom, a na dodatek nie bedziesz miał maila pierdołami zawalonego...

0

Hehe Johnny a wiesz ze to samo powiedzialem mu na BHP [diabel]
No i po malu widac poprawe [diabel]

0

Tworzysz biblioteke dll, która ma dwie funkcje inicjowania hooka i zwalniania. Jeżeli inicjujesz to najlepiej dodać mu parametr, do którego okna ma zwracać dane. I w procedurze obsługującej hook należy dopisać zwrot pobranych informacji do okna, które było podane przy inicjacji. Gdy kończysz program zwolnij hooka w procedurze z biblioteki dll.

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