La barra de idioma cambia el idioma en c # .NET

TL; DR: Tratando de resolver el problema queInputLanguage cambia el diseño de entrada pero no actualiza la visualización de la barra de idioma.

Estoy escribiendo un complemento personalizado para Trados Studio. Parte de esto es interactuar con los idiomas tanto en la aplicación como en Word, como en esta pregunta:Lista de todos los idiomas disponibles para Windows .NET Framework

El último problema que parece que no puedo resolver es que en una parte del código que estoy usandoInputLanguage configurar la entrada del teclado en en-US.

Para aclarar, hay unAPI limitada, así que tengo que ser realmente inventivo para automatizar ciertos aspectos. El mejor enfoque viable era utilizar los accesos directos predeterminados en la aplicación:

Primero cambio el idioma de entrada a en-US.

Luego envío algunas claves a la aplicación.

Luego cambio el idioma de entrada a lo que era antes.

Luego muestro un formulario.

Aquí está el código:

//change input language to English
InputLanguage currentLang = InputLanguage.CurrentInputLanguage;
InputLanguage newLang = InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo("en-US"));
if (newLang == null)
{
    MessageBox.Show("The Upload Project function requires the En-US keyboard installed.", "Missing keyboard", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    return;
}
else
{
    InputLanguage.CurrentInputLanguage = newLang;
}

//Save the document
SendKeys.SendWait("^s");

InputLanguage.CurrentInputLanguage = currentLang;

//get url and credentials from a custom input form
string[] psw = UploadData.GetPassword(
    Settings.GetValue("Upload", "Uri", "https://www.scntranslations.org/ws/services"),
    Vars.wsUsername == null ? Settings.GetValue("Upload", "User", "") : Vars.wsUsername,
    Vars.wsPassword == null ? "" : Vars.wsPassword
    );
Application.DoEvents();

La manifestación que tengo es que la barra de idioma cambia con un retraso paraEN pero para cuando aparezca el formulario, debería estarHU pero se quedaEN.

Sin embargo, si lo pruebo conDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) entonces la salida es el idioma correcto (en mi caso "húngaro").

Incluso después de que se oculta el formulario, el idioma permaneceEN, sin embargo, los tipos de teclado en húngaro y elDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) devuelve "húngaro".

Miré docenas de páginas en SO y en la web e intenté todo lo que se me ocurrió incluirSystem.Threading.Thread.Sleep(1000); yApplication.DoEvents() ySendkeys.Flush(), pero nada activa Windows para actualizar la barra de idioma, y no pude encontrar ninguna solución a este problema.

La versión anterior de este problema como se da en esta pregunta:Cambie la distribución del teclado del código C # con .NET 4.5.2
He hecho este trabajo ahora completamente con la implementación anterior de laInputLanguage excluir este último problema.

¿Alguien puede ayudar en:

dando una explicación para este comportamiento?¿sugiere una solución que active la actualización de la barra de idioma desde el código C #?

ACTUALIZAR: El código ahora funciona completamente. Implementé el BlockInput WinAPI.

[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt);

Y también apaga el bloqueo de mayúsculas usando Win API:

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

private void TurnOffCapsLock()
{
    if (Control.IsKeyLocked(Keys.CapsLock)) // Checks Capslock is on
    {
        const int KEYEVENTF_EXTENDEDKEY = 0x1;
        const int KEYEVENTF_KEYUP = 0x2;
        NativeMethods.keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
        NativeMethods.keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
        (UIntPtr)0);
    }
}

Entonces, lo que queda realmente es hacer que la barra de idioma muestre correctamente el idioma de entrada actual real.

Tengo la opción de enviar Alt + Shifts, pero realmente no quiero hacer eso.