我写的一个通常运作良好的程序现在吓到了Keys.D1的值为“LButton | ShiftKey | Space”
这是问题的屏幕抓取:
ModifierKeys是具有以下定义的枚举:
public enum ModifierKeys : uint
{
Alt = 1,
Control = 2,
Shift = 4,
Win = 8
}
这到底是怎么回事?没有其他对Keys.D1的引用。
答案 0 :(得分:3)
<强>注意强>
不要将此枚举中的值用于组合的按位运算。枚举中的值不是互斥的。
虽然System.Windows.Forms.Keys
枚举具有[Flags]
属性,但实际可以安全地用作标志的唯一标志是:
Keys.Shift
Keys.Ctrl
Keys.Alt
所有剩余的值都不是“标志”枚举值。因此,某些非“标志”值的值组合恰巧会组合形成其他不是“标志”值的值。
您所看到的效果是Enum.ToString()
运算符滥用 [Flags]
属性来构建此类组合。这是无害的,因为根据上述文档,ShiftKey
和Space
密钥永远不会被合并。