¿Cómo envío los trazos de tecla a una ventana sin tener que activarlo con la API de Windows?

Ya hice 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 teclas que se envían mediante las teclas de envío irán a la ventana a la que acabo de cambiar.

Actualmente utilizo FindWindow, IsIconic y ShowWindow desde la API de Windows. Tengo que verificar si la ventana está allí con FindWindow y establecer mi objeto en la ventana específica que se devuelve con esa llamada, luego verifico si está minimizado con IsIconic y llamo a ShowWindow si es así, y finalmente tengo que llamar Interaction.AppActivate para establecer el foco en esa ventana. Todo esto se hace antes incluso de enviar golpes de tecla. Parece que debería haber una forma de enviar simplemente golpes de tecla sin tener que mostrar la ventana y activarla. Lo importante es que, mientras mi aplicación ejecuta las teclas, no puedo hacer nada en mi computadora.

Muy bien, esto es un poco decepcionante, estoy seguro, pero fundamentalmente no puedes hacer esto con el 100% de fiabilidad.

Windows asume 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á que envía mensajes solo a la ventana activa.

Una vez dicho esto, puede enviar mensajes de SendMessage WM_KEYUP , WM_CHAR y WM_KEYDOWN y (dependiendo del WndProc que los recibe) tal vez salirse con la suya. Pero recuerde, se va a romper en algunas circunstancias, punto.

Parece que está utilizando 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 función está enfocada o no, primero debe encontrar su manejador HWND y luego publicar directamente en ella los mensajes WM_KEYUP / DOWN y WM_CHAR con el formato apropiado.

una vez que tenga el HWND de Windows, puede enviar directamente los mensajes WM_KEYDOWN y WM_KEYUP a su cola de mensajes. La ventana no tiene que estar activa.

Sin embargo, entiendo que esto depende de cómo la aplicación de destino procesa la entrada del teclado. Hay varias formas diferentes de manejarlo.

WM_KEYUP / WM_KEYDOWN es el más común y algunas aplicaciones solo procesan una u otra (generalmente WM_KEYDOWN).

WM_CHAR también es bastante común

Algunos progtwigs usan GetAsyncKeyState, GetKeyState o GetKeyboardState. Esto es extremadamente inusual, pero evita eficazmente la inyección de tecla presionada con SendMessage (). Si este es el caso, vuelva a keybd_event () que maneja directamente el controlador del teclado. Por supuesto, la ventana tendrá que estar activa