我目前正在使用一个热键包,它将一组Key
和ModifierKey
枚举作为标记。
例如,这将注册Ctrl+Shift+4
热键:
hotKey = new GlobalHotKey.HotKey(Key.D4, ModifierKeys.Shift | ModifierKeys.Control);
根据我的理解,当将枚举作为标志传递时,它实际上只是执行按位or
操作(因此语法)。
对于我的用户界面,我需要将密钥存储在List<Key>
中。但是,我最终需要将按下的键设置为新的热键,我需要将List<Key>
转换为普通的Key
(使用标志操作)。
因为我认为这只是一个按位or
操作,所以我尝试用LINQ解决这个问题。
hotkeysPressedBitwise = hotkeysPressed.Select(f => f).Aggregate((x, y) => x | y);
其中hotkeysPressed
是我的List<Key>
。我的LINQ语句正常工作,然而,当它实际传递给我的函数时它并没有给我所需的效果。
例如,当我传入X
和C
时,我的LINQ语句返回的值等于X | C
。如果我将其转换为Key
枚举,则由于某种原因它会给我F22
密钥。
hotKey = new GlobalHotKey.HotKey( keys , ModifierKeys.None);
不起作用。 (我现在将ModifierKeys设置为无类似物)。
我在这里错过了什么吗?
答案 0 :(得分:3)
假设您引用了System.Windows.Forms.Keys enum。
如果您查看Keys enum的MSDN文档,则会看到以下警告:
不要将此枚举中的值用于按位组合 操作。枚举中的值不是互斥的。
据我所知,可以与其他值组合的Keys枚举的唯一值是 Shift , Ctrl 和 Alt
请参阅枚举的摘录:
[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum Keys
{
...
A = 65,
B = 66,
C = 67,
...
Shift = 65536,
Control = 131072,
Alt = 262144
}
答案 1 :(得分:1)
与修饰符键(例如修饰符键相比,热键通常不会设计为允许多个常规键(例如字母X和C)组合使用as control,shift,alt)可以合并。
正因为如此,Key
枚举通常在常规键上使用按位运算时以可预测的方式工作,因为它们将被赋予顺序值,而修饰键将具有作为幂的值 - 的二