Я новичок здесь, и я могу быть взорван за то, что не видел старых сообщений о Ключах, но уверяю вас, что я прочитал многие из них и не могу найти ответ, который я ищу.
У меня есть программа на С#, калькулятор, которая правильно вычисляет уравнения, но я хочу иметь возможность вызывать методы с помощью нажатия и ввода с клавиатуры. Например, если пользователь вводит данные в 2 + 2 ENTER, текстовое поле будет показывать 4. Единственный способ, который программа делает на данный момент, - это то, что пользователь на самом деле нажимает на эти кнопки. Изучая, как работают клавиши в С#, я нашел много информации о KeyCode и Keys, но очень мало информации о том, как реально реализовать их в рамках программы. Одна вещь, с которой мне пришлось столкнуться в отношении реализации кода, была следующая:
private void Calculator_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
MessageBox.Show("Up button was pressed");
}
}
Имя формы - Калькулятор. Я могу скомпилировать этот код без проблем, но он ничего не делает. Я могу разместить всю программу для вас, ребята, если вы захотите, но она длится несколько страниц и содержит много комментариев и других материалов. Я просто не понимаю, почему я не могу заставить свою программу читать ключ. Я также попробовал KeyPress вместо KeyDown, все равно ничего. Любая помощь приветствуется.
Edit: Marcel N. дал хороший ответ, и я смог заставить его работать после включения KeyPreview и использования кода:
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.D1)
cmd1.PerformClick();
if (e.KeyCode == Keys.D2)
cmd2.PerformClick();
if (e.KeyCode == Keys.D3)
cmd3.PerformClick();
if (e.KeyCode == Keys.D4)
cmd4.PerformClick();
......................
}
Я очень рад, что все номера работают, но у меня все еще возникают проблемы с вводом, делением, умножением и клавишами со стрелками. Спасибо за скорую помощь.
Вам необходимо установить для свойства KeyPreview
в форме значение true.
Это приведет к тому, что все ключевые события будут переданы в форму сначала, прежде чем они будут делегированы сосредоточенному элементу управления. Затем вы можете использовать текущий обработчик KeyDown
для вызова ваших методов/обработчиков.
Наконец, если вы не хотите, чтобы ключевые события достигли сосредоточенного управления вообще, убедитесь, что для свойства KeyPressEventArgs.Handled
значение true, когда вы получаете событие на уровне формы.