Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

paulobranco

Bind de um comando a uma tecla?

Mensagens Recomendadas

paulobranco

Boas....

Estou lenta, e dolorosamente (sim, porque isto são as minhas primeiras andanças em programação) a escrever um programa bastante simples, que envia um conjunto de bytes através de uma porta de série (que é realidade uma USB, mas não interessa para o caso).

Acontece que os comandos para os enviar, e a própria formatação dessa mensagem já estão todos escritos... Mas falta-me algo...

Preciso que o programa "escute" aquilo que é enviado pelo teclado e, quando pressionada a tecla (qualquer coisa) faça então o envio da mensagem, mas que não ligue às outras teclas que forem premidas...

(E depois vou precisar disso em quadruplicado (4 mensagens para 4 teclas diferentes, ou até mais...) Mas já fico feliz se me derem umas luzes sobre como fazer a primeira...

Alguma Sugestão?

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

Olá, e bem-vindo, antes de mais.

Para isso ser possível, podes utilizar um evento que é chamado pelo form quando é carregada uma tecla, é o chamado evento KeyPress. Primeiro, tens de associá-lo ao formulário, no método Load colocas:

this.KeyPress += new KeyPressEventHandler(capturarTeclas);

e agora crias um método capturarTeclas, que terá esse mesmo propósito:

        private void capturarTeclas(object sender, KeyPressEventArgs e)
        {
            // consoante a tecla que é pressionada...
            switch (e.KeyChar)
            {
                case 'A':
                    // executar função da tecla A
                    break;

                case 'B':
                    // executar função da tecla B
                    break;

                default:
                    // carregou noutra tecla que não definimos aqui
                    // não fazer nada, ou alternativamente, pode-se mandar um erro, etc
                    break;
            }
            
        }

Agora, tenho a impressão que isto só funciona para letras e números, mas se isso não for uma limitação, acho que serve.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
paulobranco

Chega e Sobra! Logo à tarde já vou ver se arranjo um bocadinho para me dedicar a isso... Depois digo-te como correu...

Cumps

EDIT: E Obrigado, já agora :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
paulobranco

O indeciso ataca novamente...

Boas outra vez... E desculpem lá  a maçada... Mas quando me estava para me atirar a isto, percebi que talvez funcionasse, mas não era a mesma coisa... Eu sei que foi exatamente o que pedi, mas lembrei-me de outra coisa...

Vou ser mais claro... Este programa vai enviar bytes para um controlador que irá controlar um motor normal, e um servo...

O objetivo era algo do gênero...

Eu carregava no "2" do numérico, e ele enviava a mensagem "x" para o controlador, que lhe indicava que ligasse o motor, e que lhe desse "2 Volts" por  exemplo...

Eu carregava no "4" e ele enviava a mensagem "y" para o motor andar com "10 Volts".

Carregava no "7" e o controlador dava-lhe o power todo...

(depois um esquema parecido para a direção)

Mas o problema aqui, é que queria, não só que o programa enviasse a mensagem quando pressiono a tecla, como queria que enviasse outra (para parar o motor) quando a tecla fosse levantada... Não sei se será possível fazer isso com o KeyDown e KeyUp?

Mais uma vez,  obrigada pelo tempo e atenção...

Paulo Branco

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

Sim, é exactamente com esses eventos, apenas tens de fazer umas alterações no código:

Remove a associação do evento anterior, visto que não vai ser mais necessária. Agora, cria os seguintes eventos no Load, ficará:

        private void Form1_Load(object sender, EventArgs e)
        {
            this.KeyDown += new KeyEventHandler(premirTecla);
            this.KeyUp += new KeyEventHandler(soltarTecla);
        }

e as respectivas funções deves conseguir fazer, tem em atenção as suas declarações, que agora tens de comparar o código ASCII da letra:

        private void premirTecla(object sender, KeyEventArgs e)
        {
            switch (e.KeyValue) {
                // aqui temos de fazer um cast para converter o caractere para o seu ASCII correspondente
                // Importante: usar letras maiúsculas na comparação
                case (int) 'A':
                    // acção de pressionar tecla A
                    break;

                default:
                    // todas as outras teclas
                    break;
            }
        }

Para o soltar tecla é idêntico, mas com as outras acções que pretendes.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
paulobranco

E.... Funciona! Depois de algumas horas de volta disto... (Primeiro que eu descobrisse onde é que estava o Load... Ui... ) já consegui por um keydown e um keyup a funcionarem... Aproveito agora, para colocar mais 1 dúvida...

Logicamente, que isto é um form... Que não serviria apenas para isto... Queria adicionar uns botões para abrir / fechar a porta de série, um para enviar um sinal de emergência que pare tudo, etc etc etc...

O problema é que, a partir do momento em que junto um botão, ou uma textbox elas passam a ser seleccionadas por default quando inicio o programa...  E visto que o keydown e keyup estão associados ao form, pum... lá se vai tudo por água a baixo... A minha pergunta é, não é possível iniciar o programa sem ter nada seleccionado por defeito? Ou, em caso negativo, como é que associo isto a uma textbox?

Cumps

EDIT : Nevermind.. Já encontrei... Alterei a propriedade TabStop para False, nos botões e ele deixou de os selecionar... Tudo OK por enquanto... Obrigadão pela ajuda...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.