如何扩展标记的枚举

时间:2009-02-16 16:33:19

标签: c#

我有一个像这样的关键组合

Keys key=Keys.Control | Keys.Shift | Keys.D ...

我不知道如何将键变量扩展为分离的Keys值。也许是这样的

foreach(Keys k in key)
{
   MessageBox.Show(k.ToString());
}
这对我来说似乎很愚蠢。怎么做?

7 个答案:

答案 0 :(得分:9)

查看密钥的定义。除以下内容外,所有值均作为正常的互斥值:

//     The bitmask to extract a key code from a key value.
KeyCode = 65535,
//     The SHIFT modifier key.
Shift = 65536,
//     The CTRL modifier key.
Control = 131072,
//     The ALT modifier key.
Alt = 262144,

所以你需要检查的是alt,control和shift。要获取未移位的密钥,请使用

Keys value = key & Keys.KeyCode

确定是否按下了shift,alt或control

bool altValue = key & Keys.Alt
bool controlValue = key & Keys.Control
bool shiftValue = key & Keys.Shift

就是这样

答案 1 :(得分:3)

假设它是一个基于int的枚举,其组件值为1,2,4 ... ^ ^ n,您可以使用:

public static IEnumerable<T> DecomposeEnum<T>(T value) where T : struct
{
    int intValue = (int)(object) value;
    for (int bit = 0; bit < 32 && intValue >> bit != 0; bit++)
    {
        int candidate = 1 << bit;
        if ((candidate & intValue) != 0)
        {
            yield return (T) (object) candidate;
        }
    }
}

这在装箱和拆箱方面非常严峻,但主要是有效。为何大多数?好吧,让我们试试这个:

static void Main()
{
    Keys keys = Keys.Control | Keys.Shift | Keys.D;
    foreach (Keys key in DecomposeEnum(keys))
    {
        Console.WriteLine(key);
    }
}

结果是:

MButton
64
Shift
Control

这是因为“D”不是由单个位表示,而是由位组合表示。

上面的代码适用于“纯”标志类型(这就是我将其留在这里的原因)但是如果您特别想要使用密钥,您可能希望查看其他地方。

答案 2 :(得分:3)

Keys key = Keys.Control | Keys.Shift | Keys.D;

foreach (string s in key.ToString().Split(','))
{
    Keys k = (Keys) Enum.Parse(typeof(Keys), s.Trim());

    Console.WriteLine(k);
}

答案 3 :(得分:2)

标记的枚举只是很好的旧位字段,因此您必须使用位操作来查看设置了哪些值,例如:

foreach(Key i in Enum.GetValues(typeof(Keys)))
{
    if(key & i !=0)
        MessageBox.Show(i);
}

答案 4 :(得分:0)

    foreach(int keyValue in Enum.GetValues(typeof(Keys)))
    {
        if(k & keyValue != 0)
           Console.WriteLine(((Key)keyValue).ToString() + " is pressed");
    }

答案 5 :(得分:0)

int i = 1;
while (key > 0) {
    if ((key & (Keys)i) > 0)
        DoSomething();
    i <<= 1;
}

答案 6 :(得分:0)

Keys enum具有[Flags]属性,因此keys.ToString()已经输出“Control,Shift,D”而无需执行所有操作。