我希望我的应用响应左箭头和右箭头键。 所以我写了
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
当我点击键盘左侧的Ctrl时, 将调用此函数,keyData的值为
keyData = LButton | ShiftKey | Control
为什么?
谢谢!
答案 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枚举值都不是标志值。