注意:输入语言和键盘布局不是一回事。一种输入语言可以有多种布局(例如:美国英语和德沃夏克,德沃夏克左,德沃夏克右)。
我正在编写一个程序,用于测试Windows 7中的几乎所有键盘布局。我已经成功地在程序中更改了输入语言,但是如果输入语言有多个布局我只能更改为默认值。这是美国英语(多个Dvorak布局),希腊语(包括希腊语220,希腊语319,希腊语波利语等)的问题。
我目前用于更改输入语言的代码是:
string cultureChange = "{en-US}"; //just an example
InputLanguage nextLang = InputLanguage.FromCulture(cultureChange);
ChangeInputLanguage(nextLang);
public void ChangeInputLanguage(InputLanguage InputLang)
{
// Check is this Language really installed. Raise exception to warn if it is not:
if (InputLanguage.InstalledInputLanguages.IndexOf(InputLang) == -1)
throw new ArgumentOutOfRangeException();
// InputLanguage changes here:
InputLanguage.CurrentInputLanguage = InputLang;
}
输入语言具有Culture,LayoutName和Handle属性。问题是在相同输入语言(ex Dvorak和默认美国英语)的布局之间都具有完全相同的文化信息(LCID和KeyboardLayoutID两者都是1033),但是不同的LayoutNames和Handles。但据我所知,改变应用程序语言的唯一方法就是使用Culture。
答案 0 :(得分:0)
我用Google搜索了一些有效的代码,发布了答案,以防有人需要此信息。 我不知道这段代码意味着什么,但似乎有效。
public partial class myForm : Form
{
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(
System.Text.StringBuilder pwszKLID);
[DllImport("user32.dll")]
private static extern bool PostMessage(IntPtr hhwnd, uint msg, IntPtr wparam, IntPtr lparam);
[DllImport("user32.dll")]
private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
private const uint WM_INPUTLANGCHANGEREQUEST = 0x0050;
private const uint KLF_ACTIVATE = 1;
//etc more form code
然后按下按钮事件:
//Gets current keyboard layout
StringBuilder name = new StringBuilder(9);
GetKeyboardLayoutName(name);
String KeyBoardLayout = name.ToString();
//Changes current layout to Dvorak (which is 00010409)
PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout("00010409", KLF_ACTIVATE));
我计划对我需要的布局更改进行硬编码,这不是最优雅的解决方案,但我的应用程序测试的语言可能不会改变,所以我很好用这个作为解决方案。