Обнаружение нескольких одновременных нажатий клавиш в C#

Я пытаюсь эмулировать функциональность гипертерминала для своей последовательной связи на С#, обнаруживая нажатия клавиш определенных комбинаций клавиш (экранирующих последовательностей), которые нельзя напечатать, например 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());

   }
} 

person Recursive    schedule 09.10.2009    source источник


Ответы (3)


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

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

bool CtrlDown = ((e.Modifiers & Keys.Control) > 0);
bool CtrlOnlyModifierDown = ((e.ModifierKeys & Keys.Control) == Keys.Control) 
person Mike Blandford    schedule 09.10.2009
comment
Как бы я мог обнаружить комбинации клавиш таким образом? - person Recursive; 10.10.2009

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

e.KeyCode = e.KeyValue | e.Modifiers

Используйте e.KeyCode

person Pop Catalin    schedule 09.10.2009
comment
e.Keycode по-прежнему не работает. Когда я нажимаю Ctrl + C, я читаю только значение ascii C вместо всей последовательности. - person Recursive; 09.10.2009

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

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

        switch (e.KeyData)
        {
            case Keys.Control:
                {
                    if (e.KeyData == Keys.Subtract) 
                    { }
                    else if (e.KeyData == Keys.C) 
                    { }
                    break;
                }
        }
person Vasa Serafin    schedule 22.08.2012