Keypress para simular um clique de botão em C #
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);
}
}
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 ??p>
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 .