我希望我的应用程序响应左箭头和右箭头键。所以我写了
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 枚举值不是标志值。