Jump to content
  • 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?

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.