我目前正在研究一个处理设置热键以执行操作的项目。我有热键功能,但如果键仅由修饰符组成,我不想允许设置热键。例如,Ctrl+F是有效的热键,但Ctrl+Alt不是。
我尝试了几种方法将修饰键从实际的 Keys 枚举对象中剥离,然后对照 Keys.None 检查它以确定它是否仅由修饰键组成。然而,在实践中,这并不是那么好。
我首先尝试了这种方法:
private Keys StripModifiers(Keys Key)
{
return Key & ~Keys.Modifiers;
}
那没有用,因为我的 Ctrl 键似乎正在使用 LButton | 的 KeyData 属性调用 PreviewKeypress 方法。Shift键 | 控制,Keys.Modifiers 位掩码显然没有完全捕捉到。
我尝试编写自己的,更复杂的:
private Keys StripModifiers(Keys Key)
{
return Key &
~Keys.Alt &
~Keys.CapsLock &
~Keys.Control &
~Keys.ControlKey &
~Keys.LControlKey &
~Keys.LMenu &
~Keys.LShiftKey &
~Keys.LWin &
~Keys.MButton &
~Keys.Menu &
~Keys.NumLock &
~Keys.RButton &
~Keys.RControlKey &
~Keys.RMenu &
~Keys.RShiftKey &
~Keys.RWin &
~Keys.Scroll &
~Keys.Shift &
~Keys.ShiftKey;
}
但是,这也不起作用,因为按下 A 键,它只是调用了 KeyData 属性为 65 的事件,将其减少为 Keys.None,因此限制性太强。
在这一点上我几乎不知所措,以前有没有人遇到过或解决过这个问题?