Обнаружение нескольких одновременных нажатий клавиш в C # - PullRequest
2 голосов
/ 09 октября 2009

Я хочу эмулировать функциональность гипертерминала для моего последовательного соединения в C #, обнаруживая нажатия клавиш определенных комбинаций клавиш (escape-последовательностей), которые нельзя набрать, например Ctrl + C, Ctrl + Z и т. Д. Я понимаю, что эти клавиши имеют свои ASCII-эквиваленты и могут быть переданы как таковые. Но я сталкиваюсь с проблемами при обнаружении нескольких нажатий клавиш. Часть моего кода предоставлена ​​для справки:

private void Transmitted_KeyDown(object sender, KeyEventArgs e)
{


   if (e.Modifiers == Keys.Control || e.Modifiers== Keys.Shift || e.Modifiers==Keys.Alt)
   {
       var test = (char)e.KeyValue; // Only able to detect a single keypress!


       ComPort.Write(test.ToString());

   }
} 

Ответы [ 3 ]

6 голосов
/ 09 октября 2009

Если вы ищете обычные ключи, вы можете сохранить их в списке: В KeyDown добавьте ключ в список. При Key Up удалите его из списка. На KeyDown проверьте, что в списке.

Однако я не уверен, что для клавиш-модификаторов, таких как ctrl, shift, alt, есть события keydown / keyup. Для тех, кто может сделать что-то вроде этого:

bool CtrlDown = ((e.Modifiers & Keys.Control) > 0);
bool CtrlOnlyModifierDown = ((e.ModifierKeys & Keys.Control) == Keys.Control) 
2 голосов
/ 09 октября 2009

e.KeyCode содержит значение ключа + информация модификатора

e.KeyCode = e.KeyValue | e.Modifiers

Использование e.KeyCode

0 голосов
/ 22 августа 2012

Не уверен, что вам повезло.

Но попробуйте этот код:

        switch (e.KeyData)
        {
            case Keys.Control:
                {
                    if (e.KeyData == Keys.Subtract) 
                    { }
                    else if (e.KeyData == Keys.C) 
                    { }
                    break;
                }
        }
...