c# - las - como cambiar el idioma del teclado windows 8
Cambiar el diseño del teclado para otro proceso (4)
Creo que el truco es hacer que tu código se ejecute en el contexto del hilo cuyo diseño de teclado deseas cambiar. Tendrá que hacer algo 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 manejador de gancho de teclado parece una buena opción para ti aquí.
Eche un vistazo a http://www.codeproject.com/KB/threads/winspy.aspx
Estoy escribiendo un programa en C # que se ejecuta en segundo plano y permite a los usuarios usar una tecla de acceso directo para cambiar los diseños de teclado en la ventana activa. (Windows solo admite CTRL + MAYÚS y ALT + MAYÚS )
Estoy usando RegisterHotKey para capturar la tecla de acceso directo, y está funcionando bien.
El problema es que no puedo encontrar ninguna API para cambiar el diseño del teclado para la ventana enfocada.
ActivateKeyboardLayout y LoadKeyboardLayout solo pueden cambiar el diseño del teclado para el hilo de llamada.
¿Alguien sabe cómo cambiar el diseño del teclado para un hilo diferente (como lo hace la barra de idiomas)?
Otra forma que puede ser aceptable si está escribiendo algo solo para usted: defina una combinación de teclas por separado para cada diseño (como Alt + Shift + 1, etc.) y use SendInput para alternar entre ellos.
Las circunstancias en las que esto se puede utilizar están limitadas por supuesto.
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;
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout( StrCopy(Layout,''00000419''), KLF_ACTIVATE)
);