C# 捕捉Alt和x2B;其他快捷键

C# 捕捉Alt和x2B;其他快捷键,c#,wpf,shortcut,C#,Wpf,Shortcut,我必须捕捉用户的输入才能发送到我的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.K

我必须捕捉用户的输入才能发送到我的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是一个带有静态布尔变量的类,用于捕获⇧按下Shift、Alt或Ctrl和其他键(使用Alt和Ctrl代替⇧
if
子句中的移位)。第二个
如果要捕捉与Alt不同的键,⇧按住Shift键并控制快捷方式。例如,对于快捷方式Alt+C,我们有:

  • 按下键。Shift=false
  • 按住键。Alt=true
  • 按下键。Ctrl=false
  • 按键按下。按键=按键
  • 其中最后一个元素的类型为
    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,而不捕捉另一个键。
    我如何处理
    有没有更好的方法处理快捷方式?谢谢。

    如果是系统密钥(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
        }
    }
    
    更新:

    或者,您可以这样做(不需要局部变量)


    但我注意到,无论使用哪种方法(因为enum具有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
    }
    
    注意: 键。菜单表示Alt键 另外,条件显示Alt+A(并且在按下Alt+A之外的control或shift键时不调用)

    这对我来说很好

    更好的方法:,详情请参见。非常感谢,(当然)效果很好:)另一个答案非常有用。
    if (IsKeyDown(Keys.Menu) &&
        keyData == Keys.A &&
    
        KeyWasAlreadyPressed == false &&
        !IsKeyDown(Keys.Controlkey) &&
        !IsKeyDown(Keys.ShiftKey))
    {
        //Enter your code here
    }
    
    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;