TL; DR :尝试解决InputLanguage
更改input布局但不更新语言栏显示的问题。
我正在为Trados Studio编写一个自定义插件。 其中的一部分是与应用程序本身和Word中的语言进行交互,就像这个问题一样: Windows .NET框架的所有可用语言列表
我似乎无法解决的最后一个问题是,在我使用InputLanguage
设置键盘inputen-US的代码的一部分。
要说明的是, API是有限的,所以我必须在某些方面实现自动化。 最好的方法是在应用程序中使用默认的快捷方式:
首先,我将input语言改为en-US。
然后我发送一些密钥给应用程序。
然后我将input语言改回原来的样子。
然后我显示一个表单。
这里是代码:
//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();
我的performance就是,语言栏会随着EN延迟而改变,但在表单显示时,它应该是HU,但它仍然保持EN 。
但是,如果我testing它与Debug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName)
然后输出是正确的语言(在我的情况下“匈牙利”)。
即使在表单隐藏之后,语言仍然是EN ,但匈牙利语的键盘types和Debug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName)
返回“匈牙利语”。
我看了很多网页和网页,我尝试了所有我能想到的,包括System.Threading.Thread.Sleep(1000);
和Application.DoEvents()
和Sendkeys.Flush()
,但没有触发Windows更新语言栏,我找不到任何解决此问题。
此问题中给出的此问题的早期版本: 从.NET 4.5.2 C#代码中更改键盘布局
现在我已经完成了上面这个最后一步的InputLanguage
栏的实现。
任何人都可以帮忙:
更新:代码现在完全工作。 我实现了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);
还要使用Win APIclosuresCaps Lock:
[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); } }
所以剩下的就是让语言栏正确显示当前的input语言。
我可以select发送Alt + Shifts,但我真的不想这么做。