PictureBox не может сфокусироваться. Он предназначен для показа изображения, но не предназначен для ввода данных пользователем, например с клавиатуры.
Грубым подходом было бы перехватить событие OnKeyDown в самой форме, а затем проверить интересующие ключи. Это будет работать до тех пор, пока элемент управления, имеющий фокус, например, кнопка, не хочет обрабатывать эти клавиши самостоятельно.
Лучшим подходом было бы переопределение метода ProcessCmdKey () формы. Этот метод вызывается на целевом элементе управления, например на кнопке, чтобы определить, является ли ключ особенным. Если Button не распознает его как особый, он вызывает родительский элемент управления. Таким образом, ваш метод уровня формы будет вызываться для каждого нажатия клавиши, которое не является специальной клавишей для фактической цели. Это позволяет кнопке по-прежнему обрабатывать клавишу ENTER, которая используется для нажатия кнопки, но другие клавиши будут обрабатываться вашей формой.
Наконец, чтобы перехватить все ключи до того, как они будут обработаны любым из элементов управления в форме, вам нужно будет реализовать интерфейс IMessageFilter. Как то так ...
public partial class MyWindow : Form, IMessageFilter
{
public MyWindow()
{
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
// WM_KEYDOWN
if (m.Msg == 0x0100)
{
// Extract the keys being pressed
Keys keys = ((Keys)((int)m.WParam.ToInt64()));
// Test for the A key....
if (keys == Keys.A)
{
return true; // Prevent message reaching destination
}
}
}
return false;
}