在面板控件中处理键Ctrl

时间:2016-04-27 12:58:16

标签: c# winforms enums

我想在用户按下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);
}

来自:trap keystrokes

但是当我按下“Ctrl”时,它在调试模式下无效:

  

keyData = Keys.LButton | Keys.ShiftKey | Keys.Control

它没有通过Keys.Control案例。

1 个答案:

答案 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 同时。