C#中模拟按下按钮的按键

3

好的,我正在制作一个井字棋游戏,以帮助我学习C#。 我尝试为其添加一些功能,以便人们可以使用计算机上的数字键盘模拟点击按钮。

这是我的代码,但是当我使用数字键盘时,按钮不会被点击。 你们中有人能看出原因吗?

    //===============================
    // start NumPad Simulate Clicks
    //   NumPad  MyButtons
    //   7 8 9   1 2 3
    //   4 5 6   4 5 6 
    //   1 2 3   7 8 9
    //===============================
    public void myControl_NumPad7(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad7)
        {
            button1_Click(null, null);
        }
    }
    public void myControl_NumPad8(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad8)
        {
            button2_Click(null, null);
        }
    }
    public void myControl_NumPad9(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad9)
        {
            button3_Click(null, null);
        }
    }
    public void myControl_NumPad4(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad4)
        {
            button4_Click(null, null);
        }
    }
    public void myControl_NumPad5(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad5)
        {
            button5_Click(null, null);
        }
    }
    public void myControl_NumPad6(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad6)
        {
            button6_Click(null, null);
        }
    }
    public void myControl_NumPad1(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad1)
        {
            button7_Click(null, null);
        }
    }
    public void myControl_NumPad2(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad2)
        {
            button8_Click(null, null);
        }
    }
    public void myControl_NumPad3(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad3)
        {
            button9_Click(null, null);
        }
    }
2个回答

5

编辑
注意我需要更清楚地表达我的意思...

从您发布的代码中,我怀疑您已经添加了9个控件并为它们添加了键事件。这些控件只有在获得焦点时才会接收到键事件。

要全局处理窗体键盘事件,您需要将Form.KeyPreview设置为true。此外,我不会像您这样处理键,而是添加一个Form.KeyDown事件,然后编写类似以下内容的代码:

switch (e.KeyCode)
{
    case Keys.NumPad9:
        e.Handled = true;
        button3.PerformClick();
        break;
    case Keys.NumPad8:
        e.Handled = true;
        button2.PerformClick();
        break;
    // And so on
}

这将处理表单内的数字键 - 您可以删除在问题中发布的所有事件处理程序。
要编程“单击”按钮,应使用Button.PerformClick()方法,因为可能会添加多个事件处理程序到单击事件,否则不会被调用。 编辑2
switch语句的语法无效。当然,每个“case”都必须以case关键字开头...现在应该可以工作了。

这似乎是我正在寻找的,但我无法弄清楚在哪里放置您的代码。当Form1初始化后,我设置了KeyPreview = true;之后就卡住了。 - Cistoran
只需在表单的属性(属性窗口)中设置它。在属性窗口中将视图更改为事件部分,查找KeyDown事件并双击该项。这将在您的代码中添加一个新的Form_KeyDown事件,您可以在其中放置我的代码。或者,转到表单的源代码并输入"override"——从代码视窗中,选择"OnKeyDown"方法。一个桩将为您生成。在"base.OnKeyDown"行后添加我的代码。 - Thorsten Dittmar
我刚试过了一下,恐怕它仍然不起作用。我从将“:”替换为“;”时收到了几个错误。 主要的错误是: 没有可以中断或继续的封闭循环(这些来自于break;) 只有分配、调用、增量、减量和新对象表达式可以用作语句。(x3)(我在Keys.NumPad和switch的结束括号上都收到了此错误信息。) - Cistoran
抱歉,在我的示例中,switch语句的语法错误。我会更新我的回复。 - Thorsten Dittmar

1
你需要对每个按钮使用 button1.PerformClick(); 来正确调用事件,这里是信息

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接