2009-05-01 19 views

cevap

91

KeyDown işleyicide ne var? Aşağıdaki kod benim için çalışıyor. Alt + Sekme, ama bunun için sormadım: başıma dert oluyor biridir D Sen KeyUp olay değil KeyDown kullanmak zorunda

public Window1() 
{ 
    InitializeComponent(); 
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
} 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
    { 
     MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
    } 

    if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     MessageBox.Show("CTRL + TAB trapped"); 
    } 
} 
+0

Siz, teşekkür eklenebilir muhasebe ediyor. Bunun için de bunu yakalamamız gereken bir XBAP'ımız var ve XBAP üzerinde çalışmıyor gibi görünüyor. Bunu bir XBAP ile nasıl yapacağınıza dair herhangi bir fikir var mı? – FarrEver

+1

Bunu yapmanın xamly yolu var mı? – Shimmy

+13

@siz If ifadelerinizi aşağıdaki sözdizimini kullanarak temizleyebilirsiniz: 'Keyboard.Modifiers.HasFlag (ModifierKeys.Control)' – Pakman

8

...

+2

için çalışmıyor. Bunu denemedin, ama nedenini açıklayabilir misin? –

+7

Elbette. Aynı anda 2 veya daha fazla tuş vuruşu yakalamaya çalıştığınızda e.Key için KeyDown denetimini kullanamazsınız, çünkü her seferinde bir anahtar yakalar. Eğer KeyDown gerekliyse, kullanıcı örneğin bir tuş kombinasyonunu basılı tuttuğunda bir şey yapmak gibi, KeyDown'ı ve Klavye sınıfını, özellikle de IsKeyDown'ı(), belirli anahtarların test edilmesini kullanmalısınız. –

+1

Üzgünüm, burada ne demeye çalıştığını anlamıyorum. KeyUp olayı ayrıca e.Key'de sadece tek bir Anahtar değeri iletir. KeyDown yerine KeyUp'ı işlemenin "aynı anda 2 veya daha fazla tuş vuruşu yakalama" için daha iyi olabileceği özel bir örnek verebilir misiniz? Teşekkürler. –

30

Gustavo'nın cevabı tam olarak aradığım şeydi. Szymon Rozga cevabın sürümü (Çalışma

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      // 
      // TODO: somthing here 
      // 
     } 
    } 
+0

Maalesef, kullanıcı doğru ctrl düğmesini kullandığında bu işlem gerçekleşmeyecek :-) –

1

Merhaba size keydown olay bu kullanabilirsiniz: Biz yapıştırma izin hala giriş tuşları doğrulamak ama istiyoruz). Bizim WPF için çalışır o ... Biz Alt tarihinde görünmüyor, ama sadece ilk eğer

public View() 
    { 
    InitializeComponent(); 
    AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent); 
    } 

    private void controlKeyDownEvent(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
    { 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
     else 
      MessageBox.Show("CTRL + TAB trapped"); 
    } 
    } 
+0

Sorun şu ki (Keyboard.IsKeyDown (Key.LeftCtrl) && Keyboard.IsKeyDown (Key.Tab) ile bir tane daha eklersek)). Ctrl + ÜstKrktr + Sekme – Devid

+0

tuşlarına bastığımda her iki ifade de yürütülür. Ctrl + ÜstKrktr + Sekme tuşlarına bastığınızda her iki ifadede – luka

1

üzgünüm, ben yorum yapamam

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
     return; 
}