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

是否有一些全局结构,我可以使用,当我需要访问是否控制,移位,Alt 按钮是关闭的?例如,在 TreeViewMouseDown事件内。

如果是这样,怎么做?

98149 次浏览

使用类 Keyboard。使用 Keyboard.IsKeyDown你可以检查是否控制,移位,Alt 现在下来。

转变:

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

控制:

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

对于 Alt:

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

还有:

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


}
    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;
}
}

还有:

如果我的。电脑。键盘。然后..。

我的。电脑。键盘。 CtrlKeyDown

我的。电脑。键盘。 AltKeyDown

这是我如何处理它(使用 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
}
}

也许有人可以澄清为什么我必须使用 e 系统密钥,而不仅仅是 e 密钥,也许是由于修饰符?但是当我搜索修饰符 + 键时,这个方法完美地工作了。

部分借用@Josh,有点类似@Krushik,还引用了一个关于 SystemKey 与 KeyEventArgs.Key 的区别的问题(回答为什么 Josh 必须使用 SystemKey) ; 其中,通过修饰符键(如 Alt) ,e 键返回 Key。因此“真正的”密钥在 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.
}
}