2014-05-21 9 views
8

To pytanie mogło już zostać udzielone, ale nie udało mi się znaleźć właściwej odpowiedzi. Próbuję włączyć przełącznik przełącznika debugowania po naciśnięciu klawisza F12 w formularzu. Nie mogę użyć zdarzenia onkeydown, ponieważ musiałbym skonfigurować osobną funkcję dla każdego pola wraz z formularzem. Więc zbadałem i znalazłem funkcję SetWindowsHookEx, aby ustawić hak klawiatury. To działa dobrze z wyjątkiem Dostaję dwa wskazania klawisz F12 jest wciskany przy każdym naciśnięciu:Hak na klawiaturę do wyszukiwania F12 z delphi

2014/05/21 14:16:43.334 
Code: 0 
Key: 123 
KeyStroke: 5767169 
KeyStroke to Hex: 00580001 
2014/05/21 14:16:43.446 
Code: 0 
Key: 123 
KeyStroke: -1067974655 
KeyStroke to Hex: C0580001 Note: this should be the keystroke that reflects KEYDOWN 

widzę klawiszy jest możliwe metody, aby sprawdzić keydown (WM_KEYDOWN $ 0100). Moje pytanie brzmi: jak przetestować naciśnięcie klawisza dla WM_KEYDOWN?

Oto moja funkcja zwrotna:

function KeyboardHookProc(Code: Integer; Key: Word; KeyStroke: LongInt) : LongInt; 
begin 
    Result := 0; 
    if Code = HC_NOREMOVE then exit; 
    Result := CallNextHookEx(FkbHook, Code,Key,KeyStroke); 
    if Code < 0 then exit; 

{ 
WM_KEYDOWN 

} 
    if (KeyStroke and WM_KEYDOWN) = 0 then { this is where I need to test but this doesn't work! } 
    begin 
    if Code = HC_ACTION then 
    begin 
    case Key of 
     vk_F12: begin 
      TKPMF.Memo1.Lines.Add(FormatDatetime('yyyy/mm/dd hh:nn:ss.zzz',now)); 
      TKPMF.Memo1.Lines.Add('Code: ' + IntToStr(Code)); 
      TKPMF.Memo1.Lines.Add('Key: ' + IntToStr(Key)); 
      TKPMF.Memo1.Lines.Add('KeyStroke: ' + IntToStr(KeyStroke)); 
      TKPMF.Memo1.Lines.Add('KeyStroke to Hex: ' + LongToHex(KeyStroke)); 
     end; 
    end; {case} 

    end; 
    end; 

end; 
+1

Jaką wersję Delphi używasz? Dlaczego nie skorzystać z KeyPreview formularza? http://stackoverflow.com/questions/6509242/how-does-delphis-keypreview-work – Frazz

+2

W najgorszym przypadku użyj ApplicationEvents. Nie ma potrzeby przechwytywania własnej aplikacji. –

+3

Nie wiem, dlaczego ktokolwiek miałby tutaj zejść. PO wykazał dowody badań i przykładowy kod. OP jest również nowy (rep = 1), więc nie można wyjaśnić braku wyjaśnienia wersji Delphi. – Argalatyr

Odpowiedz

12

Nie trzeba przypisać inny program obsługi do OnKeyDown przypadku każdej kontroli jednostki. Możesz przypisać je wszystkie, aby korzystać z tego samego pojedynczego modułu obsługi. Jeśli włączysz właściwość formularza KeyPreview, nie będziesz musiał przypisywać programu obsługi do żadnego z formantów, możesz samodzielnie użyć zdarzenia Forma OnKeyDown. Jeśli chcesz wykryć naciśnięcie klawisza, gdy masz otwartych wiele formularzy, możesz zamiast tego użyć zdarzenia TApplication.OnMessage lub TApplicationEvents.OnMessage. Tak czy inaczej, nie musisz w ogóle używać haka klawiatury przez SetWindowsHooKEx().

Powodem, dla którego twój hak nie działa, jest to, że WM_KEYDOWN jest komunikatem okna, a nie znacznikiem naciśnięcia klawisza. Read the documentation. Klawiatura dwóch wyświetlonych komunikatów różni się tylko bitami 30 (poprzedni stan klucza) i 31 (stan przejścia).

+0

Remy, tak to było, jak zwykle, staram się robić rzeczy zbyt skomplikowane. Zawsze mogę liczyć na to, że znasz poprawną odpowiedź. –

+1

Gdy ktoś udzieli poprawnej odpowiedzi, powinieneś kliknąć przycisk, aby ją zaakceptować (działa tylko dla jednego, jeśli jest więcej niż jedna odpowiedź). W ten sposób odpowiadający otrzymuje niewielki wzrost reputacji, tak jak zrobiłeś, gdy kilku z nas wznowiło twoje pytanie, a odpowiedź nabiera zielonego kleszcza, który pomaga innym użytkownikom. – MartynA

+5

MartynA - gotowe! –

Powiązane problemy