Keys.D1 = LButton | ShiftKey |空间?

时间:2011-10-12 23:44:12

标签: c# key

我写的一个通常运作良好的程序现在吓到了Keys.D1的值为“LButton | ShiftKey | Space”

这是问题的屏幕抓取: enter image description here

ModifierKeys是具有以下定义的枚举:

public enum ModifierKeys : uint
{
    Alt = 1,
    Control = 2,
    Shift = 4,
    Win = 8
}

这到底是怎么回事?没有其他对Keys.D1的引用。

1 个答案:

答案 0 :(得分:3)

引自Keys Enumeration

  

<强>注意
  不要将此枚举中的值用于组合的按位运算。枚举中的值不是互斥的。

虽然System.Windows.Forms.Keys枚举具有[Flags]属性,但实际可以安全地用作标志的唯一标志是:

  • Keys.Shift
  • Keys.Ctrl
  • Keys.Alt

所有剩余的值都不是“标志”枚举值。因此,某些非“标志”值的值组合恰巧会组合形成其他不是“标志”值的值。

您所看到的效果是Enum.ToString()运算符滥用 [Flags]属性来构建此类组合。这是无害的,因为根据上述文档,ShiftKeySpace密钥永远不会被合并。