Чтобы использовать глобальный слушатель клавиатуры в Winforms, вам просто нужно добавить обработчик к действию KeyUp для самой главной формы:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F10)
{
textBox1.Focus();
e.Handled = true; //To use F10, you need to set the handled state to true
} else if (e.KeyCode == Keys.F11)
{
textBox2.Focus();
}
}
Затем убедитесь, что свойство KeyPreview в главной форме установленок Истине. ![enter image description here](https://i.stack.imgur.com/hSoWI.png)
Проблема с зависанием приложения при нажатии клавиши F10 вызвана тем, что оно ожидает другого последовательного действия. Чтобы обойти это, просто установите свойство Handled на keyevent в TRUE. Это освобождает неразрешенное событие.
Это весь мой класс формы, с рефакторингом для использования вспомогательного метода, как вы ссылаетесь. Это отлично работает. Но вы должны убедиться, что свойство KeyPreview в вашей форме имеет значение True, если только ваши нажатия клавиш не будут сопоставлены с вашими обработчиками событий.
namespace KeyTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
CheckKeys(e);
}
private void CheckKeys(KeyEventArgs e)
{
if (e.KeyCode == Keys.F10)
{
textBox1.Focus();
e.Handled = true;
}
else if (e.KeyCode == Keys.F11)
{
textBox2.Focus();
e.Handled = true;
}
}
}
}
Теперь в своем комментарии вы упоминаете UserControl, если хотитезатем вам нужно создать метод экземпляра в вашем классе UserControl и передать событие этому из вашего глобального обработчика событий клавиатуры в главной форме.
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public void HandleKeys(KeyEventArgs e)
{
if (e.KeyCode == Keys.F10)
{
textBox1.Focus();
e.Handled = true;
}
else if (e.KeyCode == Keys.F11)
{
textBox2.Focus();
e.Handled = true;
}
}
}
Затем в главной форме:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
CheckKeys(e);
}
private void CheckKeys(KeyEventArgs e)
{
uc1.HandleKeys(e); //Instance method on your user control.
}
}
Это тогда работает как задумано.
Как указано в одном из комментариев, лучшим способом было бы переопределить метод ProcessCmdKey в базовом классе Form. Это будет сделано так:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
userControl11.HandleKeys(keyData); // method on the userControl to handle the key code.
base.ProcessCmdKey(ref msg, keyData);
return true;
}
}
Обработчик в UserControl остается более или менее таким же:
public void HandleKeys(Keys keys)
{
if (keys == Keys.F10)
{
nameTB.Focus();
} else if (keys == Keys.F11)
{
emailTB.Focus();
}
}
Если это более правильный способ сделать это, яне уверен в. Они оба, безусловно, достигают одного и того же результата. В документации показан первый метод обработки событий клавиатуры на уровне формы: Как обрабатывать ввод с клавиатуры
Но здесь говорится, что метод ProcessCmdKey предназначен для дополнительной обработки сочетаний клавиш и MDI. accellerators. ProcessCmdKey
Я оставлю это на ваше усмотрение, чтобы решить, что лучше для вашего сценария. Но держите его, чтобы показать, как вы будете его использовать, если захотите.