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.