当用户按下修改键时如何捕获?

时间:2011-12-22 11:40:42

标签: c# .net winforms controls

即使我的控件没有焦点,我想要在按下ALT键时捕捉。

System.Windows.Forms.Control中是否有与此类似的内容?

public void OnModifierKeyPressed(KeyEventArgs e);

或者可能处理任何WndProc消息?

提前致谢。


修改

我需要捕获当用户按下ALT键以在我的控件中绘制键加速器下划线(如按钮那样)。我确定当用户按下ALT并且控件没有焦点时,会向控件发送以下消息:

WndProcMessage as integer:
296
8235
15
133
20

EDIT2:


最后,我找到了涉及的消息,here

Msg:    WM_UPDATEUISTATE                        0x0128
WParam: UISF_HIDEACCEL                          0x2

但是,正如Cody Gray所说,这不是必需的,你可以使用Control.ShowKeyboardCues属性。

1 个答案:

答案 0 :(得分:4)

只有具有焦点的控件才会收到键盘事件。因此,没有方法可以在自定义控件上覆盖或处理事件,以便在自定义控件当前没有焦点时检测按键。

无论如何,添加到您问题中的新信息表明这是无关紧要的。如果您只想在适当的时候绘制键盘加速器,那么解决方案会更简单。

在自定义控件的Paint事件处理程序中(绘制控件文本的位置),您应该检查Control.ShowKeyboardCues property的值。如果值为true,那么您应该使键盘加速器可见;否则,你应该省略绘制它们。

同样,您还应该检查Control.ShowFocusCues property的值。这会告诉您是否在控件周围绘制焦点矩形 使用ControlPaint.DrawFocusRectangle method绘制所说的焦点矩形。

类似的东西:
(我面前没有.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);         
 }