捕获特定的修改器键

本文关键字:修改器 | 更新日期: 2023-09-27 18:26:55

根据MSDN上的此页面,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);
}

捕获特定的修改器键

Messr Passant在许多个月前就回答了这个问题。

如果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);
    }