Как захватить, когда пользователь нажал клавишу-модификатор? - PullRequest
0 голосов
/ 22 декабря 2011

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

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

public void OnModifierKeyPressed(KeyEventArgs e);

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

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


EDIT:

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

WndProcMessage as integer:
296
8235
15
133
20

EDIT2:


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

Msg:    WM_UPDATEUISTATE                        0x0128
WParam: UISF_HIDEACCEL                          0x2

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

1 Ответ

4 голосов
/ 22 декабря 2011

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

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

В обработчике событий 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);         
 }
...