Cambiar la distribución del teclado para otro proceso

Estoy escribiendo un progtwig en C # que se ejecuta en segundo plano y permite a los usuarios usar una tecla de acceso rápido para cambiar la distribución del teclado en la ventana activa. (Windows solo admite CTRL + MAYÚS y ALT + MAYÚS )

Estoy usando RegisterHotKey para capturar la tecla de acceso rápido, y está funcionando bien.

El problema es que no puedo encontrar ninguna API para cambiar la distribución del teclado para la ventana enfocada.

ActivateKeyboardLayout y LoadKeyboardLayout solo pueden cambiar la distribución del teclado para el hilo de llamada.

¿Alguien sabe cómo cambiar la distribución del teclado para un hilo diferente (como lo hace la barra de idioma)?

Otra forma que puede ser aceptable si escribe algo solo para usted: defina una combinación de teclas separada para cada diseño (como Alt + Shift + 1, etc.), y use SendInput para cambiar entre ellos.

Las circunstancias en que esto es utilizable son limitadas, por supuesto.

PostMessage(handle, WM_INPUTLANGCHANGEREQUEST, 0, LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE) ); 

Creo que el truco es conseguir que su código se ejecute en el contexto del hilo cuyo diseño de teclado desea cambiar. Tendrá que hacer un poco de interoperabilidad de win32 aquí y aprender sobre la inyección de DLL para que su código se ejecute en el hilo remoto.

Un controlador de gancho de teclado parece una buena opción para usted aquí.

Eche un vistazo a http://www.codeproject.com/KB/threads/winspy.aspx

  function ChangeRemoteWndKeyboardLayoutToRussian( const RemoteHandle: THandle): Boolean; var Dumme: DWORD; Layout: HKL; begin Layout := LoadKeyboardLayout('00000419', KLF_ACTIVATE); Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, 0, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; if Result then Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, RUSSIAN_CHARSET, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; end;