c # как захватить Ctrl-R из текстового поля

У меня есть из этого текстовое поле, и я пытаюсь определить, нажата ли Ctrl-R в этом текстовом поле. Я могу обнаружить ключи отдельно, используя:

private void CheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(e.KeyChar == (char)Keys.R)
    {
        // ...
    }
    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
    {
        // ...
    }
}

Как определить, нажали ли они одновременно?


person poco    schedule 20.12.2010    source источник


Ответы (2)


Если есть возможность, измените свое мероприятие на KeyDown/KeyUp, все будет проще. (Обратите внимание, что это решение не всегда применимо)

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyData == (Keys.Control | Keys.R))
   {

   }
}
person Cheng Chen    schedule 20.12.2010
comment
Я думаю, что это сработает, однако я думаю, что в моем случае я действительно захочу поймать событие KeyUP. Причина в том, что KeyDown будет отправлен тонну, если вы удерживаете его. Спасибо Дэнни. - person poco; 20.12.2010
comment
Мне нравится этот метод в событии KeyUp. просто и легко понять, а также легко кодировать. также можно проверить другую комбинацию клавиш, если необходимо, добавив еще, если.... - person gg89; 14.03.2019

См. ответ Митча о том, как правильно построить логику битового флага, если он его восстанавливает. Вот кое-что, что сработает, если он не решит. В основном вам нужно проверить, выполняются ли оба условия одновременно:

bool isRKeyPressed = e.KeyChar == (char)Keys.R;
bool isControlKeyPressed = (Control.ModifierKeys & Keys.Control) == Keys.Control;

if (isRKeyPressed && isControlKeyPressed)
{
    // Both ...
}
else if (isRKeyPressed)
{
    // R key only ...
}
else if (isControlKeyPressed)
{
    // CTRL key only ...
}
else
{
    // None of these...
}

Выбросьте все эти чеки, которые вам не нужны.

Кроме того, вы можете проверить этот альтернативный подход: http://www.codeguru.com/columns/experts/article.php/c4639

Они переопределяют метод ProcessCmdKey в своей форме (возможно, в отдельных элементах управления?): http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx

person Merlyn Morgan-Graham    schedule 20.12.2010
comment
+1 за проверку одновременно логики и предложение переопределить метод ProcessCmdKey. Хотя я рекомендую делать это на элементе управления TextBox, из которого вы хотите захватить Ctrl+R, а не на форме в целом. Вы хотите поймать это только в том случае, если текстовое поле сфокусировано, так зачем помещать его на уровень формы? - person Cody Gray; 20.12.2010
comment
Я пробовал это, но isRKeyPressed всегда возвращает false. Однако isControlKeyPressed верно. e.KeyChar равен 18, когда нажата Ctrl-r... это 114, когда R нажата одна. Я думал просто проверить, если e.KeyChar == 18, но я не уверен, что это может вызвать другую проблему. Мне кажется не лучший подход - person poco; 20.12.2010
comment
@poco: Это не вызовет проблем, за исключением того, что многие люди считают магические числа (18) дурным тоном. Если вы можете использовать константу из перечисления Keys, то вам следует это сделать. Насколько я могу судить, 18 должно соответствовать клавише Alt (Keys.Menu), так что, возможно, у вас что-то странное происходит с клавиатурой. - person Merlyn Morgan-Graham; 21.12.2010