按住Alt+其他快捷键

本文关键字:快捷键 其他 Alt+ 按住 | 更新日期: 2023-09-27 18:14:31

我必须捕捉用户的输入,才能将快捷方式发送到我的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是一个具有静态布尔变量的类,如果⇧ShiftAlt+kbd>或CtrlAlt+kbd]和2Ctrl+kbd>而不是<kbd]⇧if子句中的Shift>(。第二个if是捕获不同于Alt的键⇧Shift键,控制键为快捷键。例如,对于快捷键Alt+C,我们有:

  1. KeyPressed.Shift = false;
  2. KeyPressed.Alt = true;
  3. KeyPressed.Ctrl = false;
  4. 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);
}

在这里,我只需将收到的输入附加到textField中,然后将所有键设置为false,以正确捕捉下一个快捷键

此代码适用于所有快捷方式,如Ctrl+A、<kbd]Ctrl>+Alt+kbd>+CShift键+LAlt键,但当我按下类似Alt+kbd>+V的快捷键时,它只会抓住Alt键,而不会抓住另一个键

我该如何处理?有没有一种方法可以更好地处理快捷方式?

按住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之外,按下控制键或移位键时不调用(

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;

这对我来说很好