【问题标题】:Form.ProcessDialogKey seems to give ambigious keys pressedForm.Process Dialog Key 似乎按下了模棱两可的键
【发布时间】:2012-08-25 13:21:42
【问题描述】:

目前,我正在覆盖我的 WinForms 表单中的 Form.ProcessDialogKey method,以允许用户在按下 Alt+1 ... Alt+9.

即按 Alt+1 应该选择第一个选项卡,Alt+2 第二个选项卡,依此类推。

这是我的代码的摘录:

protected override bool ProcessDialogKey(Keys keyData)
{
    if ((e.KeyData & Keys.Alt) == Keys.Alt)
    {
       if ((e.KeyData & Keys.D1) == Keys.D1) tabIndex = 0;
       else if ((e.KeyData & Keys.D1) == Keys.D1) tabIndex = 0;
       else if ((e.KeyData & Keys.D2) == Keys.D2) tabIndex = 1;
       else if ((e.KeyData & Keys.D3) == Keys.D3) tabIndex = 2;
       // ...
    }
}

我发现我的检查给出了多余的结果。例如。当按下 Alt+3,

(e.KeyData & Keys.D3) == Keys.D3 // <<== TRUE.

true,但其他检查也是true,例如:

(e.KeyData & Keys.D1) == Keys.D1 // <<== also TRUE.
(e.KeyData & Keys.D0) == Keys.D0 // <<== also TRUE.

我确实认为这很合乎逻辑,因为 Keys enumeration 对其他 Keys 成员值进行了很多按位组合。

所以我不知道为什么我得到太多true 结果,我只是不知道如何进行正确的检查。

我的问题:

我可以使用Form.ProcessDialogKey 方法来检查 Alt+1...Alt+9 组合还是我应该选择另一种方法?

(如果有其他方法,我很想获得它的链接)

更新 1:

似乎如果我颠倒检查顺序,即首先Keys.D9,然后再下降到Keys.D1,匹配效果更好(正确吗?)

【问题讨论】:

    标签: c# .net winforms .net-2.0 key


    【解决方案1】:

    在这里使用 & 运算符是不正确的。 Keys 枚举具有 [Flags] 属性,但它是标志和值的组合。必然如此,键比 int 或 long 中的位多得多。有些位表示修饰符,如 Keys.Alt,但低 16 位是键码,需要使用 == 运算符进行比较。

    考虑将此代码保持干燥:

        protected override bool ProcessDialogKey(Keys keyData) {
            if (keyData >= (Keys.Alt | Keys.D1) && keyData <= (Keys.Alt | Keys.D9)) {
                int cmd = (keyData & Keys.KeyCode) - Keys.D0;
                // etc...
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    

    【讨论】:

    • 谢谢,汉斯。在你回答之后,我尝试在谷歌上搜索一些关于如何正确查询 Keys 变量内的值的文档,例如我这里的其他情况。我没有找到。能否请您透露一些来源(网址?)。
    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2017-02-07
    • 1970-01-01
    • 2014-08-12
    • 2011-04-20
    相关资源
    最近更新 更多