在C#中将枚举列表转换为标志
本文关键字:转换 标志 列表 枚举 | 更新日期: 2023-09-27 17:57:41
我当前使用的热键包将一组Key
和ModifierKey
枚举作为标志。
例如,这将注册Ctrl+Shift+4
热键:
hotKey = new GlobalHotKey.HotKey(Key.D4, ModifierKeys.Shift | ModifierKeys.Control);
根据我的理解,当将枚举作为标志传入时,实际上只是执行逐位or
操作(因此是语法)。
对于我的UI,我需要将按键存储在List<Key>
中。然而,我最终需要将按下的键设置为一个新的热键,并且我需要将我的List<Key>
转换为一个普通的旧Key
(使用flags操作)。
因为我认为这只是一个位or
操作,所以我尝试使用LINQ来实现此解决方案。
hotkeysPressedBitwise = hotkeysPressed.Select(f => f).Aggregate((x, y) => x | y);
其中CCD_ 11是我的CCD_。我的LINQ语句工作正常,但是,当它实际传递到我的函数中时,并没有给我想要的效果。
例如,当我传入X
和C
时,我的LINQ语句返回一个等于X | C
的值。如果我将其转换为Key
枚举,出于某种原因,它会给我F22
密钥。
hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None);
不起作用。(出于相似性,我暂时将ModifierKeys设置为none)。
我是不是遗漏了什么?
假设您引用的是System.Windows.Forms.Keys枚举。
如果您查看MSDN文档中的Keys枚举,您将看到以下警告:
不要将此枚举中的值用于按位组合操作。枚举中的值不是互斥的。
据我所知,Keys枚举中唯一可以与其他值组合的值是Shift、Ctrl和Alt。
查看枚举的摘录:
[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum Keys
{
...
A = 65,
B = 66,
C = 67,
...
Shift = 65536,
Control = 131072,
Alt = 262144
}
热键通常不允许在一个组合中使用多个常规键(如字母X和C),而修饰符可以组合键(如control、shift、alt)。
因此,当对常规键使用逐位操作时,Key
枚举通常不会以可预测的方式工作,因为它们将被分配顺序值,而修饰符键的值将是两个的幂