捕获特定的修饰键

时间:2012-03-07 04:25:52

标签: c# winforms capture key modifier

根据MSDN上的this page,左侧控制的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);
}

1 个答案:

答案 0 :(得分:2)

Messr 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);
    }