PictureBox не может сосредоточиться. Он предназначен как способ отображения изображения, но не предназначен для ввода пользовательского ввода, например, с клавиатуры.
Грубый подход состоял в том, чтобы перехватить событие OnKeyDown в самой форме и затем проверить интересующие ключи. Это будет работать до тех пор, пока элемент управления, который имеет фокус, например, Button, не хочет обрабатывать эти ключи самостоятельно.
Лучшим подходом было бы переопределить метод FormCmdKey() формы. Этот метод называется целевым элементом управления, таким как ваша кнопка, чтобы решить, является ли ключ особенным. Если кнопка не распознает ее как специальную, она вызывает родительский элемент управления. Таким образом, для каждого нажатия клавиши будет вызываться метод уровня формы, который не является специальным ключом для фактической цели. Это позволяет 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;
}
Это WinForms? – ChrisF
Да, это так. Я забыл написать это. – Antmoritz