2014-05-21 34 views
8

Bu soru zaten yanıtlanmış olabilir, ancak uygun yanıtı bulamadım. Bir formda F12 tuşuna basıldığında hata ayıklama anahtarını açmaya çalışıyorum. Onkeydown olayını kullanamıyorum çünkü form ile birlikte her alan için ayrı bir işlev ayarlamak zorunda kaldım. Bu yüzden araştırdım ve bir klavye kanca ayarlamak için SetWindowsHookEx işlevi bulundu. İki endikasyonları F12 tuşuna olmuştur basın bunu her basıldığında alıyorum dışında bu iyi çalışıyor:delphi ile F12 aramasını sağlayan klavye kancası

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 

Ben Tuş keydown (WM_KEYDOWN $ 0100) kontrol etmek için olası bir yöntemdir görüyoruz. Sorum şu: WM_KEYDOWN için Keystroke'ı nasıl test edebilirim? Her birey kontrolün OnKeyDown olaya farklı bir işleyici atamanız gerekmez

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

Hangi Delphi sürümünü kullanıyorsunuz? Neden formun KeyPreview özelliğini kullanmıyorsunuz? http://stackoverflow.com/questions/6509242/how-does-delphis-keypreview-work – Frazz

+2

En kötü durumda bir ApplicationEvents kullanın. Kendi başvurunuzu yapmaya gerek yok. –

+3

Emin değilim, neden kimse burada reddeder. OP, araştırma kanıtı ve örnek kod gösterdi. OP ayrıca yeni (rep = 1), bu yüzden Delphi versiyonunu açıklığa kavuşturmamak mazur olabilir. – Argalatyr

cevap

12

:

İşte benim geri arama işlevidir. Hepsini aynı tek işleyiciyi kullanacak şekilde atayabilirsiniz. Formun KeyPreview özelliğini etkinleştirirseniz, herhangi bir denetleyiciye hiç bir işleyici atamanız gerekmeyecek, Formun OnKeyDown olayını tek başına kullanabilirsiniz. Birden çok form açıkken tuşa basmanız gerekiyorsa, bunun yerine TApplication.OnMessage veya TApplicationEvents.OnMessage olayını kullanabilirsiniz. Her iki durumda da, SetWindowsHooKEx() aracılığıyla bir klavye kancası kullanmanız gerekmez.

Kancanızın çalışmaz olmasının nedeni, WM_KEYDOWN bir Pencere Mesajıdır, bir Tuş vuruşu bayrağı değil. Read the documentation. Gösterdiğiniz iki iletinin Tuş vuruşu, yalnızca 30 bitleri (önceki anahtar durum) ve 31 (geçiş durumu) bakımından farklılık gösterir.

+0

Remy, evet, her zamanki gibi, işleri çok karmaşık yapmaya çalışıyorum. Doğru cevabı bilmek için her zaman size güvenebilirim. –

+1

Birisi size doğru bir cevap verdiğinde, kabul etmek için düğmeye basmanız gerekir (sadece birden fazla cevap varsa bir tane için çalışır). Böylelikle, bir kaçımız sorunuzu kışkırttığınızda yaptığınız gibi, cevap veren kişi saygınlıkta küçük bir artış elde ediyor ve cevap diğer kullanıcılara yardımcı olan yeşil bir onay elde ediyor. – MartynA

+5

MartynA - tamamlandı! –