Language Bar Sprache ändern in c # .NET

TL; DR: Der Versuch, das Problem zu lösen, dassInputLanguage ändert das Eingabe-Layout, aktualisiert jedoch nicht die Anzeige der Sprachleiste.

Ich schreibe ein benutzerdefiniertes Plugin für Trados Studio. Ein Teil davon ist die Verknüpfung mit Sprachen sowohl in der App selbst als auch in Word, wie in dieser Frage: Liste aller verfügbaren Sprachen für Windows .NET Framework

Das letzte Problem, das ich anscheinend nicht lösen kann, besteht darin, dass ich in einem Teil des Codes @ verwendInputLanguage, um die Tastatureingabe auf en-US zu setzen.

Zur Verdeutlichung gibt es einlimited API, also muss ich wirklich erfinderisch sein, wenn es darum geht, bestimmte Aspekte zu automatisieren. Der am besten umsetzbare Ansatz war die Verwendung der Standardverknüpfungen in der Anwendung:

Zunächst ändere ich die Eingabesprache auf "en-US".

Dann sende ich ein paar Schlüssel an die Anwendung.

Dann ändere ich die Eingabesprache wieder auf das, was sie vorher war.

Dann zeige ich ein Formular.

Hier ist der Code:

//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();

Die Manifestation, die ich habe, ist, dass sich die Sprachleiste mit einer Verzögerung zu @ ände DE aber zu dem Zeitpunkt, an dem das Formular angezeigt wird, sollte es @ se HU doch es bleibt DE.

Jedoch wenn ich es mit @ tesDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) dann ist die Ausgabe die richtige Sprache (in meinem Fall "Ungarisch").

Selbst nachdem das Formular ausgeblendet wurde, bleibt die Sprache DE, doch die Tastaturtypen auf Ungarisch und dasDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) gibt "Ungarisch" zurück.

Ich habe mir Dutzende von Seiten über SO und das Web angesehen und alles versucht, was mir einfiel, einschließlichSystem.Threading.Thread.Sleep(1000); undApplication.DoEvents() undSendkeys.Flush(), aber nichts veranlasst Windows, die Sprachleiste zu aktualisieren, und ich konnte keine Lösung für dieses Problem finden.

Die frühere Version dieses Problems wie in dieser Frage angegeben:Ändern Sie das Tastaturlayout von C # -Code mit .NET 4.5.2
Ich habe diese Arbeit jetzt vollständig mit der obigen Implementierung des @ gemacInputLanguage Bar das letzte Mal.

Kann jemand helfen in:

eine Erklärung für dieses Verhalten geben?suggesting eine Lösung, die die Aktualisierung der Sprachleiste von C # -Code auslöst?

AKTUALISIEREN Der Code funktioniert jetzt vollständig. Ich habe die BlockInput WinAPI implementiert.

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

Und deaktivieren Sie auch die Feststelltaste mit der 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);
    }
}

So was wirklich übrig bleibt, ist, dass die Sprachleiste die aktuelle Eingabesprache korrekt anzeigt.

Ich habe die Möglichkeit, Alt + Shifts zu senden, aber das möchte ich wirklich nicht.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage