Catch Alt +其他快捷键

时间:2016-10-24 13:08:16

标签: 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.Key && ....) 
{
KeyPressed.SetKey(e.Key);
}

其中KeyPressed是一个带有静态布尔变量的类,用于捕获⇧Shift Alt Ctrl 并按下另一个键(带< kbd> Alt 和 Ctrl 而不是if子句中的⇧Shift。第二个if用于捕获与 Alt ⇧Shift,快捷键控制不同的键。例如,对于快捷键 Alt + C ,我们有:

  1. KeyPressed.Shift = false;
  2. KeyPressed.Alt = true;
  3. KeyPressed.Ctrl = false;
  4. KeyPressed.key = Key;
  5. 最后一个元素属于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);
    
     }
    

    这里我简单地将textField附加到收到的输入,之后我将所有键设置为false以正确捕获下一个快捷方式。

    此代码适用于所有快捷方式,如 Ctrl + A Ctrl + Alt + C ⇧Shift + L Alt 但当我按下快捷键时< / strong> Alt + V ,它只捕获 Alt ,而不是其他键。
    如何管理?
    有一种更好地处理快捷方式的方法吗?谢谢。

4 个答案:

答案 0 :(得分: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以获取更多信息。

答案 1 :(得分:0)

将Alt-modifier状态存储在局部变量中。我不确定原因,但这使它对我有用。

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 &amp; V 会奏效。因此,如果我按下 Alt + G + V ,则执行。祝好运。

答案 2 :(得分:0)

如果您想在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键时不调用)

答案 3 :(得分:0)

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;

这对我来说很好