WPF'deki değiştirici anahtar durumları nasıl algılanır?


151

Control, Shift, Alt düğmelerinin basılı olup olmadığına erişmem gerektiğinde kullanabileceğim bazı global yapılar var mı? Örneğin MouseDowna TreeView.

Öyleyse nasıl?

Yanıtlar:


257

Sınıfı kullanın Keyboard. Keyboard.IsKeyDownTuşunu kullanarak Control, Shift, Alt tuşlarının basılı olup olmadığını kontrol edebilirsiniz.

Shift için:

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }

Kontrol için:

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }

Alt için:

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }

125

Ayrıca:

// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{

}

13
Çok daha iyi bir çözüm. Ayrıca tüm değiştiricileri bir kerede kontrol etmenizi sağlar. Ctrl + F ile uğraşmak istiyorsanız, Ctrl + Shift + F ile uğraşmak istemezsiniz, böylece (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)tüm diğer şeyleri yerine kontrol edebilirsiniz ...
— ygoe

35
Yukarıdaki örneklerde yapılan karşılaştırmaların farklı sonuçlar verdiğini unutmayın! ModifierKeys enum Flags özniteliğine sahip olduğundan, numarada herhangi bir değer birleşimine sahip olabilirsiniz. YALNIZCA basılan shift tuşunu yakalamak istiyorsanız, Keyboard.Modifiers == ModifierKeys.Shiftifadeyi kullanın . Shift tuşunu yakalamak istiyorsanız, ancak aynı anda diğer değiştiricilere basıldığında umursamıyorsanız, (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shiftveya daha iyi HasFlag sözdizimini kullanınKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
— Patrik B

4
Bu yöntemi kullanarak windows anahtar değiştiricisini yakalayamadım. (CTRL iyi çalıştı.) Yakalamaya çalışıyordum WIN+RightArrow.
— ANeves

1
İlginç, @ANeves Keyboard.Modifiersolarak gösterirNone
— Ayna Savage

8
    private bool IsShiftKey { get; set; }

    private void OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;

        if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
        {
           e.Handled = true;
        }
    }

2
Yanıtlar, yorumların yanı sıra kodla daha iyidir. Lütfen bir bağlam sağlayın.
— Chris

1
bir proprerty olarak ekleme harika bir fikir
— RollRoll

1
Alt + başka bir anahtar ararken PreviewKeyDown kullandığımda e.Key yerine e.SystemKey kullanmak zorunda kaldım (benim durumumda alt + başka bir karakter kullanılması durumunda e.Key değeri "Sistem" idi)
— Josh

3

Bu şekilde idare ediyorum (PreviewKeyDown kullanarak), diyelim ki Alt + R ...

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
       && e.SystemKey == Key.R)
    {
       //do whatever
    }
}

Belki birileri neden sadece e.Key değil e.SystemKey kullanmak zorunda olduğumu temizleyebilir, belki de değiştiriciden dolayı? ancak değiştirici + anahtar ararken bu benim için kusursuz bir şekilde çalıştı.


0

ve ayrıca:

My.Computer.Keyboard.ShiftKeyDown ise ...

My.Computer.Keyboard.CtrlKeyDown

My.Computer.Keyboard.AltKeyDown


0

Kısmen @Josh'tan borçlanma ve bir şekilde @ Kruşik'e benzer ve ayrıca KeyEventArgs.systemKey ve KeyEventArgs.Key arasındaki fark hakkında bir soruya atıfta bulunma (Josh'un SystemKey'i neden kullanması gerektiğini cevaplama); buradaki değiştirici tuşlarla (Alt gibi), e.Key Key.System öğesini döndürür ve bu nedenle 'gerçek' anahtar e.SystemKey içinde olur.

Bunun bir yolu, önce 'gerçek' anahtarı getirmektir ve sonra koşullu yapmaktır:

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    // Fetch the real key.
    var key = e.Key == Key.System ? e.SystemKey : e.Key;

    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
        && key == Key.Return)
    {
        // Execute your code.
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.