quiero que desde un programa "B" indicar que presione dicha tecla "X" en el programa "A", sin necesidad de que yo tenga que hacerle focus a dicho programa.
Para enviar una tecla específica sin darle foco a la ventana, se hace enviando el mensaje de ventana adecuado a la cola de mensajes de dicho proceso.
Primero debes obtener el handle de ventana (HWND) a la que quieres enviarle el mensaje (la sintetización del teclado), seguidamente debes utilizar la función Win32
SendMessage o
PostMessage (según si necesitas asincronismo) con los mensajes de ventana
WM_KEYDOWN y
WM_KEYUP (en ese orden claro está) y con los parámetros
wParam y
lParam que correspondan con a la tecla en cuestión (o evento del mouse)
En
MSDN puedes encontrar toda la documentación necesaria:
En
Python todo esto será una burrada de código, y no tengo ni idea de como se llevará a cabo la implementación del algoritmo y las definiciones Win32, así que prefiero mostrarte un ejemplo en VB.NET utilizando mi librería
ElektroKit (la tienes en mi firma) para ahorrarse las definiciones Win32, así de sencillo sería en tan solo 3 instrucciones para enviar la tecla F10 al HWND principal de un proceso sin foco:
Dim hwnd As IntPtr = Process.GetProcessesByName("nombre").Single.MainWindowHandle
NativeMethods.SendMessage(hwnd, WindowsMessages.WM_KeyDown, New IntPtr(Keys.F1), IntPtr.Zero)
NativeMethods.SendMessage(hwnd, WindowsMessages.WM_KeyUp, IntPtr.Zero, IntPtr.Zero)
Si necesitases hallar un HWND distinto al HWND principal de la ventana, y, en caso de que trabajases el código en .NET, entonces podrias aprovecharte del framework
Microsoft Windows UI Automation el cual es un conjunto de librerias muy sofisticadas para analizar la estructura de una ventana y obtener todo tipo de información y también llevar a cabo ciertas acciones/eventos con los controles (por ejemplo invocar un botón), sería un código mucho más limpio y simplificado, y con la seguridad de estar trabajando con código administrado ...en lugar de recurrir a la siempre engorrosa, fea y tediosa metodología de FindWindowEx + EnumChildwindows + etc...
para enviar un mensaje a esa ventana busca SendKeys
Si te refieres al módulo SendKeys de Python:
Entonces eso no sirve, lo que hace es enviar la pulsación del teclado a la ventana activa, es decir, a la ventana que tenga el foco (igual que hace el método de Visual Basic en el que etá basado el de Python)
Saludos!