0

目前,我正在重写 WinForms 表单中的Form.ProcessDialogKey方法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.

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

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

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

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

我的问题:

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

(如果有另一种方法,我很想获得它的链接)

更新1:

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

4

1 回答 1

3

在这里使用 & 运算符是不正确的。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);
    }
于 2012-08-25T14:35:36.843 回答