Нажатие клавиши для имитации нажатия кнопки в C # - PullRequest
2 голосов
/ 27 ноября 2009

Итак, я нахожусь в процессе создания игры в крестики-нолики, чтобы помочь мне выучить C #. Я пытаюсь добавить в него немного функциональности, поэтому я хочу, чтобы люди могли использовать NumPad на компьютере для имитации нажатия кнопок.

Вот что у меня есть, но когда я использую NumPad, кнопки не щелкают. Может кто-нибудь из вас видит причину почему?

    //===============================
    // 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 голосов
/ 27 ноября 2009

EDIT
Заметил, что мне нужно прояснить, что я имею в виду ...

Из кода, который вы опубликовали, я подозреваю, что у вас есть 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
}

Это будет обрабатывать NumPad-ключи в форме - тогда вы сможете удалить все обработчики событий, которые вы отправили в своем вопросе.

Чтобы программно «нажать» кнопку, вы должны использовать метод Button.PerformClick(), так как к событию щелчка может быть добавлено несколько обработчиков событий, которые в противном случае не будут вызываться.

РЕДАКТИРОВАТЬ 2
Синтаксис для switch -основания неверен. Конечно, каждое «дело» должно начинаться с ключевого слова case ... Теперь оно должно работать.

1 голос
/ 27 ноября 2009

Вам нужно использовать button1.PerformClick(); для каждой кнопки, чтобы правильно вызвать событие, вот info .

...