Problema con SendKeys C#

Iniciado por magarcan, 22 Octubre 2011, 18:04 PM

0 Miembros y 2 Visitantes están viendo este tema.

magarcan

Hola!! Me he descargado una aplicación de ejemplo de un cliente que utiliza socket. Lo único que le he añadido ha sido ésto:

                    switch (sRecieved)
                    {
                        case "\na":
                            SendKeys.Send("algo");
                            break;
                        case "\nb":
                            SendKeys.Send("b");
                            break;
                    }

sRecieved es un string dónde se almacenan los datos que recive el socket. El caso es que la aplicación se cierra sin dar error ni nada.

¿Alguna idea? Os dejo aquí el código que estoy utilizando. http://www.mediafire.com/?l62u2w859gx55dg

Gracias!!

Keyen Night

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

magarcan

El cliente se conecta al server sin problemas. Envío y recibo bien, pero cuando recibo uno de los caracteres definidos dentro del switch, en lugar de ejecutar el SendKeys, la aplicación se cierra sin enviar las teclas, cuando debería enviar las teclas y seguir abierta esperando nuevos envíos.

$Edu$

Ve depurando a ver si entra a algun case de esos..

magarcan

Sí, he comprobado que llega a entrar a los cases, pero cuando va a ejecutar la instrucción del SendKeys, no los manda y se cierra el programa. No da ni excepción ni leches, algo raro raro...

Keyen Night

Para enviar teclas y texto a ventanas a travéz de su handle yo uso la API SendMessage, funciona mejor que SendKeys mira estos ejemplos:

Código (C#) [Seleccionar]


            public enum WindowMessage : int
            {
                WM_KEYDOWN = 0x0100,
                WM_KEYUP = 0x0101,
                WM_CHAR = 0x0102,
                WM_LBUTTONDOWN = 0x201,
                WM_LBUTTONUP = 0x202
            }

        public static void SendKey(IntPtr WindowhWnd, Int32 key)
        {
            WinApi.SendMessage(WindowhWnd, WindowMessage.WM_KEYDOWN, (int)key, 0);
            WinApi.SendMessage(WindowhWnd, WindowMessage.WM_CHAR, (int)key, 0);
            WinApi.SendMessage(WindowhWnd, WindowMessage.WM_KEYUP, (int)key, 0);
        }

        public static void SendString(IntPtr WindowhWnd, string String)
        {
            foreach (var x in String)
                SendKey(WindowhWnd, Convert.ToInt32(x));
            Thread.Sleep(3);
        }
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

magarcan

Las "teclas" quiere que se envíen a un proceso concreto, ¿cómo podría obtener el handle?

Keyen Night

SendMessage no envia este tipo de mensajes a los procesos sino a las ventanas por lo tanto es el Handle (hWnd) de la ventana lo que necesitas obtener.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Unbr0ken

#8
Cita de: magarcan en 22 Octubre 2011, 22:36 PM
Las "teclas" quiere que se envíen a un proceso concreto, ¿cómo podría obtener el handle?

Nativo: API -> FindWindow.

Gestionado: IntPtr pHandle = Process.GetProcessesByName("ElProceso")[0].MainWindowHandle;

...
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.