如何检测WPF中的修饰键状态?

Joa*_*nge 137 .net c# keyboard wpf

当我需要访问Control,Shift,Alt按钮是否关闭时,是否有一些全局构造可以使用?例如MouseDown,一个内部事件TreeView.

如果是这样的话?

Kyr*_*o M 232

使用课程Keyboard.使用Keyboard.IsKeyDown您可以检查Control,Shift,Alt现在是否已关闭.

换班次:

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Run Code Online (Sandbox Code Playgroud)

对于控制:

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Run Code Online (Sandbox Code Playgroud)

对于Alt:

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Run Code Online (Sandbox Code Playgroud)


Chu*_*age 114

还有:

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

}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,上述示例中的比较会产生不同的结果!由于ModifierKeys枚举具有Flags属性,因此您可以在枚举中包含任何值组合.如果您只想捕获按下的shift键,请使用`Keyboard.Modifiers == ModifierKeys.Shift`语句.如果你想捕捉shift键但不关心是否同时按下其他修饰符,请使用`(Keyboard.Modifiers&ModifierKeys.Shift)== ModifierKeys.Shift`或更好的HasFlag语法`Keyboard.Modifiers. HasFlag(ModifierKeys.Shift)` (30认同)
  • 更好的解决方案.它还允许您一次检查所有修改器.如果你想处理Ctrl + F,你不想处理Ctrl + Shift + F,所以你可以检查`(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control) `而不是所有其他的东西...... (11认同)
  • 我无法使用此方法捕获Windows键修饰符.(CTRL工作正常.)我试图抓住`WIN + RightArrow`. (2认同)

小智 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 评论和代码的答案更好.请提供一些背景信息. (2认同)

Jos*_*osh 6

这就是我处理它的方式(使用 PreviewKeyDown),假设我们正在寻找 Alt + R...

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

也许有人可以澄清为什么我必须使用 e.SystemKey 而不仅仅是 e.Key,也许是由于修饰符?但这在搜索修饰符+键时对我来说完美无缺。


小智 5

部分借用@Josh,有点类似于@Krushik,还引用了有关KeyEventArgs.systemKey和KeyEventArgs.Key之间差异的问题(回答为什么Josh必须使用SystemKey);其中,使用修饰键(例如 Alt)时,e.Key 返回 Key.System,因此“真实”键位于 e.SystemKey 内。

解决这个问题的方法是首先获取“真实”密钥,然后执行条件:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)