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!!
Y cuál es el problema ._.?
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.
Ve depurando a ver si entra a algun case de esos..
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...
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:
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);
}
Las "teclas" quiere que se envíen a un proceso concreto, ¿cómo podría obtener el handle?
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.
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 (http://pinvoke.net/) -> FindWindow (http://pinvoke.net/default.aspx/user32/FindWindow.html).
Gestionado:
IntPtr pHandle = Process.GetProcessesByName("ElProceso")[0].MainWindowHandle;...