Языковая панель изменить язык в C # .NET

TL; DR: Пытаясь решить проблему,InputLanguage изменяет структуру ввода, но не обновляет отображение языковой панели.

Я пишу пользовательский плагин для Trados Studio. Частично это связано с языками как в самом приложении, так и в Word, как в этом вопросе:Список всех доступных языков для Windows .NET Framework

Последняя проблема, которую я, похоже, не могу решить, это то, что в части кода, которую я используюInputLanguage установить ввод с клавиатуры на en-US.

Чтобы уточнить, естьограниченный API, поэтому я должен быть действительно изобретательным в автоматизации некоторых аспектов. Лучшим подходящим подходом было использование ярлыков по умолчанию в приложении:

Сначала я изменяю язык ввода на en-US.

Затем я отправляю несколько ключей в приложение.

Затем я меняю язык ввода обратно на прежний.

Затем я показываю форму.

Вот код:

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

Я имею в виду то, что языковая панель изменяется с задержкой наEN но к тому времени, когда форма появляется, это должно бытьHU пока остаетсяEN.

Однако, если я проверю это сDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) тогда вывод будет правильным языком (в моем случае «венгерский»).

Даже после того, как форма скрыта, язык остаетсяENТем не менее, клавиатура печатает на венгерском иDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName) возвращает "венгерский".

Я просмотрел десятки страниц на SO и в Интернете и попробовал все, что мог, включаяSystem.Threading.Thread.Sleep(1000); а такжеApplication.DoEvents() а такжеSendkeys.Flush(), но ничего не вызывает Windows для обновления языковой панели, и я не мог найти решение этой проблемы.

Более ранняя версия этой проблемы, как указано в этом вопросе:Изменить раскладку клавиатуры из кода C # с .NET 4.5.2
Я сделал эту работу сейчас полностью с вышеупомянутой реализациейInputLanguage Бар это последний подъём.

Кто-нибудь может помочь в:

дать объяснение этому поведению?предлагая решение, которое запускает обновление языковой панели из кода C #?

ОБНОВИТЬ: Код теперь полностью работает. Я реализовал 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);

А также отключение Caps Lock с помощью 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);
    }
}

Так что на самом деле осталось получить языковую панель для правильного отображения текущего текущего языка ввода.

У меня есть возможность отправить Alt + Shift, но я действительно не хочу этого делать.

Ответы на вопрос(0)

Ваш ответ на вопрос