我有一个像这样的关键组合
Keys key=Keys.Control | Keys.Shift | Keys.D ...
我不知道如何将键变量扩展为分离的Keys值。也许是这样的
foreach(Keys k in key)
{
MessageBox.Show(k.ToString());
}
这对我来说似乎很愚蠢。怎么做?
答案 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”而无需执行所有操作。