Это простое исправление, так как при отпускании ключа событие KeyUp не получает никакой информации о выпущенном ключе, поэтому просто установите для свойства значение true:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_clear = true;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
Если вы хотите, чтобы он работал в режиме реального времени, добавьте метку в форму и добавьте ее под каждым параметром переменной _clear:
label1.Text = _clear.ToString();
За ваш комментарий измените второй блок кода на:
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(other shortcut conditionals go here or on other else if's)
{
_clear = true;
}
Единственное время, в течение которого это условие будет выполняться, - это когда контроль удерживается сам по себе. В другом случае это делается для того, чтобы установить _clear в true, когда вы нажимаете ctrl, а затем другую клавишу, потому что, как только вы нажимаете control, оно запускает событие KeyDown.
Исходя из этого изменения, до тех пор, пока вы позаботитесь о нажатиях клавиш, следующих за оператором if (например, else if ()), вам не нужно ничего устанавливать в событии KeyUp.
См. мой ответ здесь на тонкости ключей и их свойств , если вам нужна более подробная информация.
Редактировать # 3:
Пока вы устанавливаете _clear в true в первой строке каждого условия, вы сможете избежать проблемы, с которой вы столкнулись в своем комментарии:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(e.KeyData.ToString() == "O, Control")
{
_clear = true;
//Do other stuff here, such as opening a file dialog
}
}