关于在c#winform中覆盖ProcessCMDKey

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

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

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

 keyData = LButton | ShiftKey | Control 

这是为什么?

谢谢!

调试器因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枚举值都不是标志值。