How to detect modifier key states in WPF?

前端 未结 6 1534
粉色の甜心
粉色の甜心 2020-12-04 15:10

Is there some global constructs that I can use whenever I need to access whether the Control, Shift, Alt buttons are down? For instance inside MouseDown event o

相关标签:
6条回答
  • 2020-12-04 15:20

    Partly borrowing from @Josh, and somewhat similar to @Krushik, and also referencing a question about the Difference between KeyEventArgs.systemKey and KeyEventArgs.Key (answering why Josh has to use SystemKey); wherein, with modifier keys (such as Alt), e.Key returns Key.System, and thus the 'real' key is within e.SystemKey.

    A way around this, is to first fetch the 'real' key, and then do your conditional:

    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.
        }
    }
    
    0 讨论(0)
  • 2020-12-04 15:23

    There's also:

    // Have to get this value before opening a dialog, or user will have released the control key
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
    {
    
    }
    
    0 讨论(0)
  • 2020-12-04 15:24

    and as well:

    if My.Computer.Keyboard.ShiftKeyDown then ...

    My.Computer.Keyboard.CtrlKeyDown

    My.Computer.Keyboard.AltKeyDown

    0 讨论(0)
  • 2020-12-04 15:34

    This is how I handle it (using PreviewKeyDown), let's say we are looking for Alt + R...

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

    Maybe someone can clear up why I had to use e.SystemKey and not just e.Key, maybe due to the modifier? but this has worked flawlessly for me when searching for modifier+key.

    0 讨论(0)
  • 2020-12-04 15:38
        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;
            }
        }
    
    0 讨论(0)
  • 2020-12-04 15:39

    Use class Keyboard. Using Keyboard.IsKeyDown you can check if Control, Shift, Alt is down now.

    For Shift:

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

    For Control:

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

    For Alt:

    if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
    { /* Your code */ }
    
    0 讨论(0)
提交回复
热议问题