Языковая панель изменить язык в 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, но я действительно не хочу этого делать.