none
Detectar secuencia de teclas pulsadas RRS feed

  • Pregunta

  • Buenas tardes.

    Llevo mucho tiempo realizando este código, pero no logro hacerlo funcionar como debería. Lo que quiero hacer es pulsar la tecla Ctrl y, sin soltar dicha tecla, guardar todas las demás teclas que se han pulsado hasta que se ha levantado la tecla Ctrl. El problema está que el evento KeyUp se lanza a pesar que la tecla sigue pulsada. Espero que alguien tenga alguna idea o como podría hacerlo.

    Muchas gracias.


    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina.

    viernes, 13 de diciembre de 2019 17:01

Respuestas

  • Hola LTNs

    Creo que la SFML (Simple and Fast Multimedia Library) que uso para programar video juegos, tiene la posibilidad de hacer lo que estás preguntando, con sus funciones de teclado muy poderosas ... tendrías que incluir en la carpeta donde va tu .EXE una o dos DLLs ... te paso el código?

    Saludos

    Pablo

    • Marcado como respuesta LTNs sábado, 14 de diciembre de 2019 11:25
    viernes, 13 de diciembre de 2019 21:19

Todas las respuestas

  • hola

    Intenta usando el

    Form.ProcessCmdKey(Message, Keys) Método

    Form.ProcessDialogKey(Keys) Método

    El tema es que no vas a detectar cuando se deja de pulsar una tecla

    porque el Ctrl de por si no es una tecla que funcione sola, sino que lo hace en conjunto con otras, por eso lo que detectaras sera que se pulsa el Ctrl + otro tecla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator viernes, 13 de diciembre de 2019 18:54
    • Votado como útil LTNs viernes, 13 de diciembre de 2019 19:53
    viernes, 13 de diciembre de 2019 18:27
  • Muchas gracias Leandro,

    pero por desgracia no puedo crear mi código con eso, necesito saber exactamente cuando se ha levantado la tecla.


    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina.

    viernes, 13 de diciembre de 2019 19:54
  • Hola LTNs

    Creo que la SFML (Simple and Fast Multimedia Library) que uso para programar video juegos, tiene la posibilidad de hacer lo que estás preguntando, con sus funciones de teclado muy poderosas ... tendrías que incluir en la carpeta donde va tu .EXE una o dos DLLs ... te paso el código?

    Saludos

    Pablo

    • Marcado como respuesta LTNs sábado, 14 de diciembre de 2019 11:25
    viernes, 13 de diciembre de 2019 21:19
  • Hola Tigre Pablito,

    Sí, pásame el código si no te importa, me será de gran ayuda. Mientras tanto voy a ir investigando esa librería a ver si logro hacer algo.

    Muchas gracias.


    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina.

    sábado, 14 de diciembre de 2019 10:17
  • Hola LTNs

    Este es el código del Form1.cs

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using SFML.System;
    using SFML.Window;
    using SFML.Graphics;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            private bool readingKeys = false;
            private bool stop = false;
            private List<Keyboard.Key> keys;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                RenderWindow window = new RenderWindow(new VideoMode(10, 10), "SFML Window");
                window.KeyPressed += new EventHandler<SFML.Window.KeyEventArgs>(window_KeyPressed);
                window.KeyReleased += new EventHandler<SFML.Window.KeyEventArgs>(window_KeyReleased);
                keys = new List<Keyboard.Key>();
    
                while (true) 
                {
                    window.DispatchEvents();
                    if (stop == true)
                        break;
                }
            }
    
            private void window_KeyPressed(object sender, SFML.Window.KeyEventArgs e) 
            {
                if (e.Code == Keyboard.Key.LControl || e.Code == Keyboard.Key.RControl)
                { 
                    readingKeys = true;
                    stop = false;
                }
                else if (readingKeys == true)
                    keys.Add(e.Code);
            }
    
            private void window_KeyReleased(object sender, SFML.Window.KeyEventArgs e) 
            {
                if (e.Code == Keyboard.Key.LControl || e.Code == Keyboard.Key.RControl)
                { 
                    readingKeys = false;
                    stop = true;
                    foreach (Keyboard.Key key in keys) 
                        listBox1.Items.Add(key.ToString());
                }
            }
        }
    }
    

    Tenes que descargar SFML.Net, y pegar los archivos: sfml-system-2.dll, sfml-window-2.dll, sfml-graphics-2.dll, csfml-system-2.dll, csfml-window-2.dll, y csfml-graphics-2.dll en la carpeta donde va tu .EXE, y en el nodo Referencias de tu proyecto agregar los 3 primeros. En el diseño de tu Form tenes que poner un button1 y un listBox1.

    Para descargar SFML (usa la versión 2.4 que vienen las DLL directamente)

    https://www.sfml-dev.org/download/sfml.net/

    Y funciona así: das click al button1, y luego pulsas la tecla Ctrl; sin soltar la misma, presionas todas las teclas que quieras. Cuando sueltas Ctrl las teclas que pulsaste aparecen en el listBox1.

    Hay una cosa que no se con exactitud si se puede evitar, es que aparezca la ventana SFML. Porque el objeto de la clase RenderWindow que soporta los Eventos KeyPressed y KeyReleased fue diseñado para realizar video juegos o animaciones. Igual esa ventana la hice muy chiquita, espero no te moleste. Lo probé y funciona perfectamente. Si queres puedo averiguar si esto se puede lograr sin que se vea la ventana o si se puede hacer invisible. 

    Saludos

    Pablo


    sábado, 14 de diciembre de 2019 19:01