0

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

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

当我点击键盘左侧的Ctrl时,会调用这个函数,keyData的值为

keyData = LButton | ShiftKey | Control

这是为什么?

谢谢!

4

1 回答 1

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 枚举值不是标志值。

于 2013-01-28T12:44:55.023 回答