none
Controllo tastiera da form RRS feed

  • Domanda

  • Ciao a tutti,

    sto creando un'applicazione che controlla un motore servo dopo aver selezionato la porta seriale e i baud rate. Fatto cio premo il tasto connetti che mi disabilita questi tre elementi e fa rimanere attivo solo il tasto disconnetti.

    Il problema è che il controllo del motore avviene da tastiera e gli eventi di keydown e keyup sono legati alla form, che sembra non essere in focus quando premo i tasti; Ho provato ad abilitare la proprieta keypreview in true ma non risolvo niente.

    Qualcuno sa aiutarmi? allego qui il codice:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;

    namespace ControlloMotori_v01
    {
        public partial class Form1 : Form
        {
            bool su = false;
            bool giu = false;
            bool sinistra = false;
            bool destra = false;

            public Form1()
            {
                InitializeComponent();
                PorteDisponibili();
            }
            //Definisco una funzione che ricerca le porte disponibili
            void PorteDisponibili()
            {
                string[] porte = SerialPort.GetPortNames();
                CmBox_PortaSeriale.Items.AddRange(porte);
            }

            private void btn_Connetti_Click(object sender, EventArgs e)
            {
                try
                {
                    if (CmBox_BaudRate.Text == "" || CmBox_PortaSeriale.Text == "")
                    {
                        MessageBox.Show("Selezionare impostazioni per la porta seriale");
                    }
                    else
                    {
                        SerialPort01.PortName = CmBox_PortaSeriale.Text;
                        SerialPort01.BaudRate = Convert.ToInt32(CmBox_BaudRate.Text);
                        SerialPort01.Open();
                        btn_Disconnetti.Enabled = true;
                        btn_Connetti.Enabled = false;
                        CmBox_BaudRate.Enabled = false;
                        CmBox_PortaSeriale.Enabled = false;
                        Form1.ActiveForm();
                    }
                }
                catch (UnauthorizedAccessException)
                {
                    MessageBox.Show("Unauthorized Access Exception");
                }
            }

            private void btn_Disconnetti_Click(object sender, EventArgs e)
            {
                SerialPort01.Close();
                btn_Disconnetti.Enabled = false;
                btn_Connetti.Enabled = true;
                CmBox_PortaSeriale.Enabled = true;
                CmBox_BaudRate.Enabled = true;
            }
            private void Timer01_Tick(object sender, EventArgs e)
            {
                Movimenti();
            }

            private void Movimenti()
            {
                if (su == true)
                {
                    SerialPort01.Write("U");
                }
                if (giu == true)
                {
                    SerialPort01.Write("D");
                }
                if (sinistra == true)
                {
                    SerialPort01.Write("L");
                }
                if (destra == true)
                {
                    SerialPort01.Write("R");
                }
            }

            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {        
               switch (e.KeyCode)
                    {
                        case Keys.Up:
                            su = true;
                            break;
                        case Keys.Down:
                            giu = true;
                            break;
                        case Keys.Right:
                            destra = true;
                            break;
                        case Keys.Left:
                            sinistra = true;
                            break;
                    }         
                Movimenti();
                Timer01.Start();
            }

            private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.Up:
                        su = false;
                        break;
                    case Keys.Down:
                        giu = false;
                        break;
                    case Keys.Right:
                        destra = false;
                        break;
                    case Keys.Left:
                        sinistra = false;
                        break;
                }
                if (!su || !giu || !sinistra || !destra)
                {
                    Timer01.Stop();
                }
            }
        }
    }

    lunedì 21 ottobre 2019 14:40

Risposte