【问题标题】:Stripping modifiers from Windows Form Keys从 Windows 窗体键中去除修饰符
【发布时间】:2012-05-25 11:35:33
【问题描述】:

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

我现在很茫然,以前有没有人遇到过或解决过这个问题?

【问题讨论】:

    标签: c# winforms events keyboard hotkeys


    【解决方案1】:

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

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

    然后您在谈论 ProcessKeyPreview() 时会有些迷茫。您应该使用 ProcessCmdKey() 而不是顺便说一句。那是稍后,在用户选择了 IsValidShortcutKey() 认为有效的密钥很久之后。是的,any 键将使该方法运行,无论它是否与您选择的快捷方式匹配。由于 Keys.ToString() 方法在显示真正的击键方面做得很糟糕,这是由具有 [Flags] 属性的 Keys 枚举引起的。转换为 int 以查看实际值。

    所以你应该有两个非常不同的代码块。选项菜单中的一个块,用于检查请求的击键是否有效。它应该使用 IsValidShortcutKey()。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多