【问题标题】:Catch Alt + other key shortcutCatch Alt + 其他快捷键
【发布时间】:2023-03-12 12:10:01
【问题描述】:

我必须捕捉用户的输入才能将快捷方式发送到我的 WPF 应用程序。
我在互联网上发现我必须这样做:
按下键时捕捉:

void keyDown(object sender, KeyEventArgs e) {
if ((Keyboard.Modifiers & Modifiers.Shift) == Modifiers.Shift) 
{
KeyPressed.SetShift(true);
}
if ( Key.Shift != e.Key && Key.LeftAlt != e.Key && ....) 
{
KeyPressed.SetKey(e.Key);
}

其中 KeyPressed 是一个带有静态布尔变量的类,如果 ⇧ShiftAltCtrl 以及另一个键被按下(带有 Alt 和 Ctrl 而不是 if 子句中的 ⇧Shift)。第二个if 是捕捉一个不同于Alt⇧Shift、Control 的快捷键作为快捷键。例如,对于快捷键 Alt+C 我们有:

  1. KeyPressed.Shift = false;
  2. KeyPressed.Alt = true;
  3. KeyPressed.Ctrl = false;
  4. KeyPressed.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+ACtrl+Alt+ C, ⇧Shift+L, Alt, 但是当我按下快捷键就像 Alt+V,它只捕捉 Alt,而不捕捉另一个键。
我该如何管理?
有什么方法可以更好地处理快捷方式?谢谢。

【问题讨论】:

标签: c# wpf shortcut


【解决方案1】:

如果是 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;
    }
}

您可以查看我的回答 here 了解更多信息。

【讨论】:

  • 非常感谢,(当然)它工作正常:)另一个答案非常有帮助。
【解决方案2】:

将 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 属性),包括 AltV 在内的任何键组合都可以使用。因此,如果我按下 Alt+G+V,两者都会执行。祝你好运。

【讨论】:

    【解决方案3】:

    如果你想在 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 之外,按下 control 或 shift 键时不要调用)

    【讨论】:

      【解决方案4】:
      switch (e.Key)
              {
                  case Key.System:
                          if ((((System.Windows.Input.KeyboardEventArgs)(e)).KeyboardDevice).Modifiers == ModifierKeys.Alt)
                          {
                          if ( e.SystemKey==Key.Left)
                          {
                                  moiveVideoPsition(-30);
                                  break;
                           }
      
                          if (e.SystemKey == Key.Right)
                          {
                              moiveVideoPsition(30);
                              break;
                          }
      
      
                      }
                          break;
      

      这对我很有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多