在C#中将枚举列表转换为标志

本文关键字:转换 标志 列表 枚举 | 更新日期: 2023-09-27 17:57:41

我当前使用的热键包将一组KeyModifierKey枚举作为标志。

例如,这将注册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语句工作正常,但是,当它实际传递到我的函数中时,并没有给我想要的效果。

例如,当我传入XC时,我的LINQ语句返回一个等于X | C的值。如果我将其转换为Key枚举,出于某种原因,它会给我F22密钥。

hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None);不起作用。(出于相似性,我暂时将ModifierKeys设置为none)。

我是不是遗漏了什么?

在C#中将枚举列表转换为标志

假设您引用的是System.Windows.Forms.Keys枚举。

如果您查看MSDN文档中的Keys枚举,您将看到以下警告:

不要将此枚举中的值用于按位组合操作。枚举中的值不是互斥的。

据我所知,Keys枚举中唯一可以与其他值组合的值是ShiftCtrlAlt

查看枚举的摘录:

[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枚举通常不会以可预测的方式工作,因为它们将被分配顺序值,而修饰符键的值将是两个的幂