Нажатие клавиши Для Имитации нажатия кнопки в C#

StackOverflow https://stackoverflow.com/questions/1807483

  •  05-07-2019
  •  | 
  •  

Вопрос

Итак, я нахожусь в процессе создания игры в крестики-нолики, которая поможет мне выучить 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);
        }
    }
Это было полезно?

Решение

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

Судя по опубликованному вами коду, я подозреваю, что у вас есть 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() метод, поскольку к событию click может быть добавлено более одного обработчика событий, которое в противном случае не было бы вызвано.

ПРАВКА 2
Синтаксис для switch-заявление было недействительным.Конечно, каждое "дело" должно начинаться с case ключевое слово...Теперь это должно сработать.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top