即使我的控件没有焦点,我想要在按下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
属性。
答案 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);
}