Как захватить, когда пользователь нажал клавишу-модификатор?

Я хочу захватить, когда нажата клавиша ALT, даже если мой элемент управления не имеет фокуса.

Есть ли что-то подобное в System.Windows.Forms.Control?

public void OnModifierKeyPressed(KeyEventArgs e);

Или, может быть, обработка любого сообщения WndProc?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Мне нужно захватить, когда пользователь нажал клавишу ALT, чтобы нарисовать ключевой ускоритель под моим контролем (как кнопка). Я уверен, что следующие сообщения отправляются в элемент управления, когда пользователь нажимает ALT, а элемент управления не имеет фокуса:

WndProcMessage as integer:
296
8235
15
133
20

EDIT2:

Наконец, я нашел сообщение, которое задействовано здесь:

Msg: WM_UPDATEUISTATE 0x0128
WParam: UISF_HIDEACCEL 0x2

Но, как сказал Коди Грей, это не нужно, вы можете использовать свойство Control.ShowKeyboardCues.

1 ответ

Только управление с фокусом будет получать события клавиатуры. Таким образом, для вашего настраиваемого элемента управления не существует метода переопределения или события, которое позволит вам обнаруживать нажатия клавиш, когда ваш пользовательский элемент управления в настоящее время не имеет фокуса.

Во всяком случае, новая информация, добавленная к вашему вопросу, указывает, что это не имеет значения. Если все, что вы хотите сделать, это нарисовать ускорители клавиатуры в соответствующее время, там гораздо проще решение.

В обработчике событий Paint для вашего настраиваемого элемента управления (где вы рисуете текст управления) вы должны проверить значение свойства Control.ShowKeyboardCues. Если значение true, то вы должны сделать клавиатурные ускорители видимыми; в противном случае вы должны опустить их рисование.

Аналогично, вы также должны проверить значение свойства Control.ShowFocusCues. Это говорит вам, нужно ли рисовать прямоугольник фокуса вокруг элемента управления. Используйте метод ControlPaint.DrawFocusRectangle для рисования указанного прямоугольника фокусировки.

Что-то вроде: (У меня нет компилятора.NET передо мной, поэтому код может иметь ошибки...)

// Draw the text
using (StringFormat sf = new StringFormat())
{
 sf.Alignment = StringAlignment.Center;
 sf.LineAlignment = StringAlignment.Center;
 sf.HotkeyPrefix = this.ShowKeyboardCues ? HotkeyPrefix.Show : HotKeyPrefix.Hide;

 if (this.Enabled)
 {
 using (Brush br = new SolidBrush(this.ForeColor))
 {
 g.DrawString(this.Text, this.Font, br, this.ClientRectangle, sf);
 }
 }
 else
 {
 SizeF sz = g.MeasureString(this.Text, this.Font, Point.Empty, sf);
 RectangleF rc = new RectangleF(Point.Empty, sz);
 ControlPaint.DrawStringDisabled(g, this.Text, this.Font, this.BackColor, rc, sf);
 }
 }

 // Draw the focus rectangle
 if (this.ShowFocusCues && this.ContainsFocus)
 {
 ControlPaint.DrawFocusRectangle(g, this.ClientRectangle); 
 }

licensed under cc by-sa 3.0 with attribution.