捕获特定的修饰键

Posted

技术标签:

【中文标题】捕获特定的修饰键【英文标题】:Capture specific modifier key 【发布时间】:2012-03-07 04:25:51 【问题描述】:

根据 MSDN 上的this page,Left Control 的Key Value 是 162。如何确定在代码中是否按下了此键?目前,每次我尝试处理按键时,我都会得到值17,它只是一个通用控制键。有没有办法区分这两者?我尝试过覆盖 ProcessCmdKey 并处理文本框的 PreviewKeyDown,但它们都返回 17 而不是 162。我需要对所有修饰键执行此操作,并且在最终硬编码值之前,是否有更好的替代方法在代码中捕获这些?

编辑:添加代码。澄清一下,我想检索 162 数字,而不仅仅是找到区分修饰符的替代方法。

private void PortfolioNameTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

    var val = e.KeyValue; //17 when control is pressed and not 162



protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

    //msg.Wparam = 17
    return base.ProcessCmdKey(ref msg, keyData);

【问题讨论】:

你能提供你用来捕获按键的代码吗(我假设你想从你的表单中而不是全局捕获它)? 我已经添加了代码,是的,只是表单。 在 WinForms 中,我认为您不走运。您只能处理传递给您的应用程序的键码。一个潜在的解决方法是设置一个全局密钥挂钩并检查当前应用程序是否是您自己的。 【参考方案1】:

Mes-s-r Passant answered 这么多年前。

如果 KeyEventArgs 包含它会很好,但尽管如此,您可以像这样实现它:

    [DllImport("user32.dll")]
    private static extern short GetAsyncKeyState(Keys key);

    private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    
        Console.WriteLine("Ctrl:0, LCtrl:1, RCtrl:2",
        GetAsyncKeyState(Keys.ControlKey) < 0,
        GetAsyncKeyState(Keys.LControlKey) < 0,
        GetAsyncKeyState(Keys.RControlKey) < 0);
    

【讨论】:

啊,请阅读您的评论...您可以通过蛮力使用这种方法获得您的魔法 162。例如,如果 (GetAsyncKeyState(Keys.LControlKey)

以上是关于捕获特定的修饰键的主要内容,如果未能解决你的问题,请参考以下文章

捕获 NSEvent 以添加修饰符问题

C# MouseKeyHook:某些键 + 修饰符组合不起作用

键绑定中的修饰符(SHIFT +(随机键))

键盘事件、事件修饰符

vue中的按键修饰符

调度点击事件并保留击键修饰符