Barra de idiomas altera o idioma no c # .NET

TL; DR: Tentando resolver o problema queInputLanguage altera o layout de entrada, mas não atualiza a exibição da barra de idiomas.

Estou escrevendo um plugin personalizado para o Trados Studio. Parte disso está na interface com os idiomas no próprio aplicativo e no Word, como nesta pergunta:Lista de todos os idiomas disponíveis para a estrutura do Windows .NET

O último problema que parece não conseguir resolver é que em uma parte do código que estou usandoInputLanguage para definir a entrada do teclado para en-US.

Para esclarecer, existe umaAPI limitada, então eu tenho que ser realmente inventivo ao automatizar certos aspectos. A melhor abordagem viável foi usar os atalhos padrão no aplicativo:

Primeiro, mudo o idioma de entrada para en-US.

Então eu envio algumas chaves para o aplicativo.

Então eu mudo o idioma de entrada para o que era antes.

Então eu mostro um formulário.

Aqui está o 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();

A manifestação que tenho é que a barra de idiomas muda com um atraso paraPT mas quando o formulário aparecer, ele deverá estarHU ainda permanecePT.

No entanto, se eu testá-lo comDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) então a saída é o idioma correto (no meu caso "húngaro").

Mesmo depois que o formulário está oculto, o idioma permanecePT, mas os tipos de teclado em húngaro e emDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) retorna "húngaro".

Eu olhei para dezenas de páginas no SO e na Web e tentei de tudo que conseguia pensar, incluindoSystem.Threading.Thread.Sleep(1000); eApplication.DoEvents() eSendkeys.Flush(), mas nada aciona o Windows para atualizar a barra de idiomas e não foi possível encontrar nenhuma solução para esse problema.

A versão anterior deste problema, conforme fornecida nesta pergunta:Alterar o layout do teclado do código C # com o .NET 4.5.2
Fiz este trabalho agora totalmente com a implementação acima doInputLanguage barrar este último caos.

Alguém pode ajudar em:

dando uma explicação para esse comportamento?sugerindo uma solução que aciona a atualização da barra de idiomas do código c #?

ATUALIZAR: O código agora funciona totalmente. Eu implementei o 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);

E também desative o Caps Lock usando a API do Win:

[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);
    }
}

Então, o que resta realmente é fazer com que a Barra de idiomas mostre corretamente o idioma de entrada atual.

Eu tenho a opção de enviar Alt + Shifts, mas eu realmente não quero fazer isso.

questionAnswers(0)

yourAnswerToTheQuestion