Pergunta

Ok, então eu estou no processo de fazer um jogo Tic-Tac-Toe para me ajudar a aprender C #. Eu estou tentando adicionar um pouco de funcionalidade a ele, então eu quero que as pessoas sejam capazes de usar o teclado numérico de um computador para simular clicando nos botões.

Aqui está o que eu tenho, mas quando eu usar o NumPad os botões não clique. qualquer um de vocês pode ver uma razão por que motivo?

    //===============================
    // 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);
        }
    }
Foi útil?

Solução

Editar
notado que eu tenho que ser mais clara sobre o que quero dizer ...

A partir do código que você postou eu suspeito que você tem 9 controles que você adicionou a sua chave-eventos para. Esses controles só receberá-chave eventos quando eles estão focados.

Para lidar com chaves globalmente para o formulário, você tem que definir Form.KeyPreview para true. Além disso, eu não iria lidar com as chaves da maneira que você faz, mas adicionar um Form.KeyDown evento e escrever algo como:

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

Isto irá lidar com as NUMPAD-Keys dentro do formulário -. Então você pode remover todos os manipuladores de eventos em que você postou sua pergunta

Para programaticamente "clique" um botão, você deve usar o método Button.PerformClick(), como mais de um manipulador de eventos pode ser adicionado ao evento clique, o que não seria chamado de outra forma.

EDIT 2
Sintaxe para a switch-declaração era inválido. É claro que cada "caso" deve começar com a palavra-chave case ... Agora ele deve funcionar.

Outras dicas

Você precisa usar button1.PerformClick(); para cada botão para evento de invocação corretamente, de aqui info .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top