¿Cómo envío pulsaciones de teclas a una ventana sin tener que activarla usando la API de Windows?
Ya he creado una aplicación que envía comandos a una ventana activada. Quiero poder usar la computadora mientras mi proceso se está ejecutando porque tan pronto como cambio el foco a otra ventana, las pulsaciones de teclas que se envían mediante las teclas de envío irán a la ventana a la que acabo de cambiar.
Actualmente uso FindWindow, IsIconic y ShowWindow desde la API de Windows. Tengo que verificar si la ventana está allí con FindWindow y configurar mi objeto en la ventana específica que se devuelve con esa llamada, luego verifico si está minimizada con IsIconic y llamo a ShowWindow si lo está, y finalmente tengo que llamar Interaction.AppActivate para establecer el foco en esa ventana. Todo esto se hace incluso antes de enviar las pulsaciones de teclas. Parece que debería haber una manera de simplemente enviar pulsaciones de teclas sin tener que mostrar la ventana y activarla. Lo importante es que mientras mi aplicación ejecuta las pulsaciones de teclas, no puedo hacer nada en mi computadora.
Muy bien, estoy seguro de que esto es un poco decepcionante, pero fundamentalmente no se puede hacer esto con un 100% de confiabilidad.
Windows supone que la ventana activa es la que recibe la entrada del teclado. La forma correcta de falsificar la entrada del teclado es con SendInput , y notarás que envía mensajes solo a la ventana activa.
Dicho esto, puede enviar mensajes WM_KEYUP , WM_CHAR y WM_KEYDOWN y (dependiendo del WndProc que los reciba) tal vez salirse con la suya. Pero recuerde, se romperá en algunas circunstancias, punto.
Parece que estás usando keybd_event() o SendInput(), que envían pulsaciones de teclas a la ventana actualmente activa. Para dirigir las pulsaciones de teclas a una ventana específica, independientemente de si esa ventana está enfocada o no, primero debe encontrar su identificador HWND y luego publicar mensajes WM_KEYUP/DOWN y WM_CHAR con el formato adecuado directamente en ella.