我是否可以使用一些全局结构来判断控制(Control)、Shift和Alt键是否按下?比如在TreeView
的MouseDown
事件中。
如果可以,具体该怎么做呢?
使用类Keyboard
。 通过使用Keyboard.IsKeyDown
,您可以检查控件、Shift和Alt是否已按下。
对于Shift:
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;
}
}
这是我处理它的方式(使用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
}
}
部分参考@Josh的内容,有些类似于@Krushik,并且参考了一个关于KeyEventArgs.systemKey和KeyEventArgs.Key的区别的问题(回答为什么Josh必须使用SystemKey);在其中,对于修改键(如Alt),e.Key返回Key.System,因此'real' key在e.SystemKey中。
解决这个问题的方法是先获取'real' key,然后执行条件语句:
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.
}
}
还有:
如果 My.Computer.Keyboard.ShiftKeyDown 则...
My.Computer.Keyboard.CtrlKeyDown
My.Computer.Keyboard.AltKeyDown
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
而不是其他所有内容... - ygoeKeyboard.Modifiers == ModifierKeys.Shift
语句。如果您想捕捉 Shift 键但不在意同时按下其他修饰键,则使用(Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
或者更好的 HasFlag 语法Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)
。 - Patrik BKeyboard.Modifiers
显示为None
。 - Chuck Savage