关于在c#winform中覆盖ProcessCMDKey

时间:2013-01-28 12:24:38

标签: c# winforms

我希望我的应用响应左箭头和右箭头键。 所以我写了

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

当我点击键盘左侧的Ctrl时, 将调用此函数,keyData的值为

keyData = LButton | ShiftKey | Control

为什么?

谢谢!

1 个答案:

答案 0 :(得分:5)

调试器因Keys枚举的声明而感到困惑。看起来像这样:

[Flags]
public enum Keys {
    LButton = 1,
    ShiftKey = 0x10,
    ControlKey = 0x11,
    Control = 0x20000,
    // And lots more
}

打开[Flags]属性后,调试器可视化工具会尝试在keyData中显示各个位的值。您按下了Control键Keys.ControlKey,其值为0x11。控制标志因此而打开,因此keyData = 0x20011。

因此调试器将0x20011解释为位并使其为0x20000 | 0x00010 | 0x00001。变成“LButton | ShiftKey | Control”。除了在调试器表达式中使用(int)keyData之外,没有任何好方法可以使它更智能。基本问题是枚举上的[Flags]属性,它只是稍微合适,但绝大多数Keys枚举值都不是标志值。