我想在用户按下Ctrl时处理该事件,所以我使用它:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Down:
this.Parent.Text = "Down Arrow Captured";
break;
case Keys.Up:
this.Parent.Text = "Up Arrow Captured";
break;
case Keys.Tab:
this.Parent.Text = "Tab Key Captured";
break;
case Keys.Control:
this.Parent.Text = "<CTRL> Captured";
break;
case Keys.Alt | Keys.Z:
this.Parent.Text = "<ALT> + Z Captured";
break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
但是当我按下“Ctrl”时,它在调试模式下无效:
keyData = Keys.LButton | Keys.ShiftKey | Keys.Control
它没有通过Keys.Control案例。
答案 0 :(得分:2)
如果keyData
的值为Keys.LButton | Keys.ShiftKey | Keys.Control
,那么switch语句中的所有情况都不匹配。当然case Keys.Control
不匹配,因为Keys.LButton | Keys.ShiftKey | Keys.Control != Keys.Control
。
要检查Keys.Control
,您必须使用以下代码:
if (keyData.HasFlag(Keys.Control))
this.Parent.Text = "<CTRL> Captured";
您不能使用switch语句来检查枚举中的标志。您必须检查各个标志,这些标志还允许您处理多个修改键的情况,例如 Control , Shift 和 Alt 同时。