Jak sądzę ma za zadanie przechwytywanie wciśnięcia dowolnego klawisza podając jego nr np Insert = 45.... I przechwytuje wiele razy, ale gdy dam np:
void __fastcall TForm4::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)
{
Edit1->Text = Key;
}
Oczywiście, że to działa. Nie wywołujesz okna komunikatu, więc focus pozostaje na oknie w którym wciskasz klawisze. Problem powoduje właśnie okno komunikatu, które przechwytuje focus, więc na tym należy się skupić.
Dodam, że gdy okno dodatkowe znajdzie się pod głównym oknem programu już wcale nie reaguje na naciśniecie w klawisze
To oczywiste, przechwytywanie komunikatu o wciśnięciu klawisza w oknie działa, tylko gdy okno jest aktywne i ma ustawiony focus.
Niemniej jednak u mnie w C++Builder 2010, w WinXP to działa prawidłowo i nie ma znaczenia czy okno jest modalne czy niemodalne.
Próbuj ustawić focus na formularz:
void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if(Key == 45)
{
if(Application->MessageBox(L"Zapisać", L"Komunikat", MB_YESNO | MB_ICONQUESTION)
== ID_NO) return;
else
{
;
}
}
this->SetFocus();
}
Znacznie pewniejszym rozwiązaniem jest użycie metody
WindowProc. Ustawienie
KeyPrewiew nie ma tutaj znaczenia, gdyż nie korzystamy z żadnego zdarzenia:
Plik nagłówkowy Unit2.h dynamicznie tworzonego formularz TForm2:private:
TWndMethod KeyApp;
void __fastcall GetKeyApp(TMessage &Msg);
Plik źródłowy Unit2.cpp dynamicznie tworzonego formularz TForm2:
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
KeyApp = this->WindowProc;
this->WindowProc = GetKeyApp;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::GetKeyApp(TMessage &Msg)
{
/* Przykłąd sprawdzenia który klawisz wciśnięto
if(Msg.Msg == WM_KEYDOWN)
{
ShowMessage((String)Msg.WParam);
} */
if(Msg.Msg == WM_KEYDOWN && Msg.WParam == 45)
{
if(Application->MessageBox(
L"Zapisać", L"Komunikat", MB_YESNO | MB_ICONQUESTION) == IDNO) return;
else
{
ShowMessage("Zapisano");
}
}
KeyApp(Msg);
}
Dodam, że gdy okno dodatkowe znajdzie się pod głównym oknem programu już wcale nie reaguje na naciśniecie w klawisze
By działało przechwytywanie klawiszy w oknie programu, okno w którym przechwytujemy klawisz musi być aktywne, czyli musi być na wierzchu i nie może być przesłonięte żadnym innym oknem.
Jeżeli chcesz przechwytywać wciśnięcie klawiszy, nie w oknie programu lecz w systemie, to musisz zamontować haka systemowego, czyli przechwytywać komunikaty systemowe.
dział:
porady API Keyloger, czyli przechwytywanie wciśnięcia klawiszy we wszystkich programach.
Jeszcze raz przypominam: rób odstępy jednaj linii pomiędzy tagami BBCode. Twoje posty trudno się czyta, gdyż są źle formatowane. Nie musisz oszczędzać miejsca. Poza tym to nie są topicy, lecz wątki skłądające się z postów. To tak apropo Twojej wypowiedzi w ostatnim poście, który zmoderowałem.