gpt4 book ai didi

c# - 从 Windows 窗体键中剥离修饰符

转载 作者:行者123 更新时间:2023-11-30 17:12:26 25 4
gpt4 key购买 nike

我目前正在处理一个项目,该项目处理设置热键以执行操作。我有热键功能,但如果键仅由修饰符组成,我不想允许设置热键。例如,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,因此限制太多。

在这一点上我几乎不知所措,以前有没有人遇到或解决过这个问题?

最佳答案

您的原始代码是正确的。您可以使用 Key & Keys.KeyCode 使其更易读,但会产生相同的结果。所以你需要在选项窗口中使用这个方法:

private static IsValidShortcutKey(Keys key) {
return (key & Keys.KeyCode) != Keys.None;
}

然后您在谈论 ProcessKeyPreview() 时会有点不知所措。您应该使用 ProcessCmdKey() 而不是顺便说一句。那是稍后,在用户选择一个被 IsValidShortcutKey() 认为有效的 key 很久之后。是的,任何 键都会使该方法运行,无论它是否与您选择的快捷方式匹配。由于具有 [Flags] 属性的 Keys 枚举导致 Keys.ToString() 方法在显示真实击键方面做得很糟糕,因此造成了额外的困惑。转换为 int 以查看实际值。

因此您应该有两个 截然不同的代码块。选项菜单中的一个 block ,用于检查请求的击键是否有效。它应该使用 IsValidShortcutKey()。

还有另一个检查键是否被按下的 block 。这应该类似于这样的东西:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == keySelectedInConfig) {
RunOperationSelectedInConfig();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}

关于c# - 从 Windows 窗体键中剥离修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com