C# - 更改输入语言键盘布局(例如:希腊语下的希腊语(319))

时间:2017-01-04 16:55:09

标签: c# layout keyboard

注意:输入语言和键盘布局不是一回事。一种输入语言可以有多种布局(例如:美国英语和德沃夏克,德沃夏克左,德沃夏克右)。

我正在编写一个程序,用于测试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。

1 个答案:

答案 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));

我计划对我需要的布局更改进行硬编码,这不是最优雅的解决方案,但我的应用程序测试的语言可能不会改变,所以我很好用这个作为解决方案。