捕捉Alt +其他键快捷键

3

我需要捕获用户的输入并将其发送到我的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是一个类,其中包含静态布尔变量,用于捕获是否按下了⇧ShiftAltCtrl和另一个键(在if子句中使用AltCtrl代替⇧Shift)。第二个if用于捕获与快捷键不同的键。例如,对于快捷键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+ACtrl+Alt+C⇧Shift+LAlt,但是当我按下Alt+V这样的快捷方式时,它只捕获Alt,而不是其他键。

我该如何处理这个问题?有没有更好的方法来处理快捷方式?


更好的方式:InputBindings,详情请参阅此文章 - Manfred Radlwimmer
4个回答

9

当出现系统键(例如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;
    }
}

你可以在这里查看我的回答,获取更多信息。


非常感谢,(当然)它很好用 :) 另一个答案也很有帮助。 - A. Wolf
这是如何和何时被调用的? - undefined

1

将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,两者都会执行。祝好运。

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 键时才不会调用)


0
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;

这对我很有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接