Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Form.ProcessDialogKey似乎给出了模棱两可的按键_C#_.net_Winforms_.net 2.0_Key - Fatal编程技术网

C# Form.ProcessDialogKey似乎给出了模棱两可的按键

C# Form.ProcessDialogKey似乎给出了模棱两可的按键,c#,.net,winforms,.net-2.0,key,C#,.net,Winforms,.net 2.0,Key,目前,我正在覆盖WinForms表单内部,以允许用户在按Alt+1时直接选择表单内部选项卡控件的选项卡页。。。Alt+9 即,按Alt+1应选择第一个选项卡,按Alt+2应选择第二个选项卡,以此类推 这是我的代码摘录: protected override bool ProcessDialogKey(Keys keyData) { if ((e.KeyData & Keys.Alt) == Keys.Alt) { if ((e.KeyData & K

目前,我正在覆盖WinForms表单内部,以允许用户在按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时

我确实认为这是非常合乎逻辑的,因为它不需要对其他
成员值进行大量的按位组合

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

我的问题:

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

(如果有另一个aproach,我很想获得它的链接)

更新1:


如果我颠倒检查顺序,即首先是
Keys.D9
,然后是
Keys.D1
,则匹配效果更好(正确?

,在此处使用&运算符是不正确的。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);
    }
protectedoverride bool ProcessDialogKey(Keys-keyData){

如果(keyData>=(Keys.Alt | Keys.D1)和&keyData在此处使用&运算符是不正确的。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);
    }
protectedoverride bool ProcessDialogKey(Keys-keyData){

如果(keyData>=(Keys.Alt | Keys.D1)&&keyData谢谢,Hans。在您的回答之后,我尝试在谷歌上搜索一些文档,了解如何正确查询
Keys
变量中的值,其他情况与我类似。我在这里没有找到。您能透露一些来源(URL)吗谢谢你,汉斯。在你回答之后,我试着在谷歌上搜索一些关于如何正确查询
变量中的值的文档,其他情况如我的情况。我没有找到。你能透露一些来源(URL)吗。
    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);
    }