Захват определенной клавиши-модификатора - PullRequest
1 голос
/ 07 марта 2012

Согласно этой странице в MSDN, 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 Ответ

2 голосов
/ 07 марта 2012

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