Problem z globalnym hookiem na klawiaturze

0

Witam wszystkich mam problem. Mianowicie mam aplikację, która jest typu MDI no i chciałem po naciśnięciu ESC żeby zamykała się aktywna forma typu MDIChild. Udało mi się to zrobić aczkolwiek problem jest gdy wszystkie okna typu MDIChild są już zamknięte i ktoś naciśnie klawisz ESC na formie głównej, która jest typu MDIForm. Całe środowisko się wiesza i pozostaje jedynie uruchomić ponownie delphiego.

Ma ktoś pomysł jak to rozwiązać?

var
MainHook : HHOOK;
function KeyHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall;
var
  Buffer: TEventMsg;
begin
  result := 0 ;
  Buffer := PEventMsg(lParam)^;
  if Buffer.message = wm_KeyDown then
    if (Buffer.paramH = 1) then
      if (act) and (Screen.ActiveForm.FormStyle = fsMDIChild)  then
        Screen.ActiveForm.Close
      else
        exit;
end;
MainHook := SetWindowsHookEx(wh_JournalRecord, KeyHook, HInstance, 0);
UnhookWindowsHookEx(MainHook);
0

:|

  1. jesli to twoja aplikacja, i twoje formy to po co zakladac globalnego hooka na klawiature? przypisz odpowiedni kod do onkeyUp tych form.
  2. jesli to "obcy" program, to dlaczego stosujesz screen.activeform? to dziala tylko w obrebie twojego programu a nie calego systemu.
  3. czy w tej procedurze nie powinno sie znalezc "CallNextHookEx()" ?
0

cimak to jest moja aplikacja ale OnKeyUP dziala tylko gdy masz focusa na formie. Jesli np bedziesz w edicie to ci juz nie zadziala poza tym ta funkcjonalnosc wyszla na koncu a co za tym idzie klepanie tego samego na 50 formatkach jest bez sensu. Szukalem w ApplicationEvents zdarzenia onKeyPress ktore rozwiazaloby moj problem ale takiego nie znalazlem dlatego globalny hook. Co do kodu natomiast to jest on z naszego forum ja go tylko przerobilem pod moje potrzeby

0

Na pewno na formie masz jakieś przyciski. Prawdopodobnie jest tam też przycisk ZAMKNIJ. Jeśli nie ma, możesz dorobić.
I ustawić mu właściwość CANCEL na TRUE.
(nie pamiętam, czy zwykły TButton to ma, ale BitBtn na bank).

0

Juhas cos mi to na tym buttonie nie dziala. Czekam na dalsze sugestie

0

Dobra już nie ważne poradziłem sobie w następujący sposób:
Na formie po której dziedziczą wszystkie mdichildy ustawiłem

KeyPreview := True

i w OnKeyPres dałem:

if Key = #27 then Close;

Działa tak jak potrzebowałem

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