捕捉 Alt + 其他快捷键
Catch Alt + other key shortcut
我必须捕获用户的输入以将快捷方式发送到我的 WPF 应用程序。
我在互联网上发现我必须执行如下操作:
捕获时按下一个键:
void keyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers.HasFlag(Modifiers.Shift))
KeyPressed.SetShift(true);
if (Key.Shift != e.Key && Key.LeftAlt != e.Key && ....)
KeyPressed.SetKey(e.Key);
}
其中 KeyPressed 是一个 class,如果 ⇧Shift、Alt 或 Ctrl 和另一个键被按下(使用 Alt 和 Ctrl 而不是 ⇧Shift 在 if
子句中)。第二个if
是抓一个不同于Alt,⇧Shift,快捷键Control的键。例如,对于快捷方式 Alt+C 我们有:
KeyPressed.Shift = false;
KeyPressed.Alt = true;
KeyPressed.Ctrl = false;
KeyPressed.key = Key;
其中最后一个元素的类型为System.Window.Input.Key
。
释放键时捕获:
void keyUp(object sender, KeyEventArgs e)
{
if (KeyPressed.getShift())
this.textField.Text += "+Shift";
if (KeyPressed.getKeyCode())
this.textField.Text += "+" + KeyPressed.k.toString();
KeyPressed.SetShift(false);
}
在这里我只是将收到的输入附加到文本字段,之后我将所有键设置为 false 以正确捕获下一个快捷方式。
此代码适用于所有快捷方式,例如 Ctrl+A、Ctrl+Alt+C,⇧Shift+L, Alt, 但是当我按下快捷方式时 Alt+V ,它只捕获 Alt,而不捕获其他键。
我该如何管理?有没有办法更好地处理快捷方式?
如果是 SystemKey(Alt 等),您需要获取实际密钥,您可以使用此辅助函数获取系统密钥背后的真实密钥。
public static Key RealKey(this KeyEventArgs e)
{
switch (e.Key)
{
case Key.System:
return e.SystemKey;
case Key.ImeProcessed:
return e.ImeProcessedKey;
case Key.DeadCharProcessed:
return e.DeadCharProcessedKey;
default:
return e.Key;
}
}
您可以查看我的回答了解更多信息。
将 Alt 修饰符状态存储在局部变量中。我不确定原因,但这使它对我有用。
private bool _altModifierPressed = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
_altModifierPressed = (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt));
if (_altModifierPressed && Keyboard.IsKeyDown(Key.V))
{
// code to handle Alt + V
}
}
更新:
或者,您可以这样做(不需要局部变量)
if (((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) && Keyboard.IsKeyDown(Key.V))
{
// code to handle Alt + V
}
但我注意到,无论采用哪种方法(因为枚举具有 Flag 属性),包括 Alt 和 V 在内的任何键组合都将工作。例如,如果我按 Alt+G+V,两者都会执行。祝你好运。
如果你想在 Office VSTO 的 KeyboardHook 中使用[Alt + A]
,就是这样使用的。
if (IsKeyDown(Keys.Menu) &&
keyData == Keys.A &&
KeyWasAlreadyPressed == false &&
!IsKeyDown(Keys.Controlkey) &&
!IsKeyDown(Keys.ShiftKey))
{
//Enter your code here
}
注:
Key.Menu 表示 Alt 键
还有条件说,Alt+A(除了 Alt+A 之外,当按下控制键或 shift 键时不调用)
switch (e.Key)
{
case Key.System:
if (((KeyboardEventArgs)e).KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if (e.SystemKey == Key.Left)
moiveVideoPsition(-30);
else if (e.SystemKey == Key.Right)
moiveVideoPsition(30);
}
break;
这很适合我
我必须捕获用户的输入以将快捷方式发送到我的 WPF 应用程序。
我在互联网上发现我必须执行如下操作:
捕获时按下一个键:
void keyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers.HasFlag(Modifiers.Shift))
KeyPressed.SetShift(true);
if (Key.Shift != e.Key && Key.LeftAlt != e.Key && ....)
KeyPressed.SetKey(e.Key);
}
其中 KeyPressed 是一个 class,如果 ⇧Shift、Alt 或 Ctrl 和另一个键被按下(使用 Alt 和 Ctrl 而不是 ⇧Shift 在 if
子句中)。第二个if
是抓一个不同于Alt,⇧Shift,快捷键Control的键。例如,对于快捷方式 Alt+C 我们有:
KeyPressed.Shift = false;
KeyPressed.Alt = true;
KeyPressed.Ctrl = false;
KeyPressed.key = Key;
其中最后一个元素的类型为System.Window.Input.Key
。
释放键时捕获:
void keyUp(object sender, KeyEventArgs e)
{
if (KeyPressed.getShift())
this.textField.Text += "+Shift";
if (KeyPressed.getKeyCode())
this.textField.Text += "+" + KeyPressed.k.toString();
KeyPressed.SetShift(false);
}
在这里我只是将收到的输入附加到文本字段,之后我将所有键设置为 false 以正确捕获下一个快捷方式。
此代码适用于所有快捷方式,例如 Ctrl+A、Ctrl+Alt+C,⇧Shift+L, Alt, 但是当我按下快捷方式时 Alt+V ,它只捕获 Alt,而不捕获其他键。
我该如何管理?有没有办法更好地处理快捷方式?
如果是 SystemKey(Alt 等),您需要获取实际密钥,您可以使用此辅助函数获取系统密钥背后的真实密钥。
public static Key RealKey(this KeyEventArgs e)
{
switch (e.Key)
{
case Key.System:
return e.SystemKey;
case Key.ImeProcessed:
return e.ImeProcessedKey;
case Key.DeadCharProcessed:
return e.DeadCharProcessedKey;
default:
return e.Key;
}
}
您可以查看我的回答
将 Alt 修饰符状态存储在局部变量中。我不确定原因,但这使它对我有用。
private bool _altModifierPressed = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
_altModifierPressed = (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt));
if (_altModifierPressed && Keyboard.IsKeyDown(Key.V))
{
// code to handle Alt + V
}
}
更新:
或者,您可以这样做(不需要局部变量)
if (((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) && Keyboard.IsKeyDown(Key.V))
{
// code to handle Alt + V
}
但我注意到,无论采用哪种方法(因为枚举具有 Flag 属性),包括 Alt 和 V 在内的任何键组合都将工作。例如,如果我按 Alt+G+V,两者都会执行。祝你好运。
如果你想在 Office VSTO 的 KeyboardHook 中使用[Alt + A]
,就是这样使用的。
if (IsKeyDown(Keys.Menu) &&
keyData == Keys.A &&
KeyWasAlreadyPressed == false &&
!IsKeyDown(Keys.Controlkey) &&
!IsKeyDown(Keys.ShiftKey))
{
//Enter your code here
}
注: Key.Menu 表示 Alt 键 还有条件说,Alt+A(除了 Alt+A 之外,当按下控制键或 shift 键时不调用)
switch (e.Key)
{
case Key.System:
if (((KeyboardEventArgs)e).KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if (e.SystemKey == Key.Left)
moiveVideoPsition(-30);
else if (e.SystemKey == Key.Right)
moiveVideoPsition(30);
}
break;
这很适合我