【问题标题】:C# - Changing Input Language Keyboard Layout (Ex: Set Greek (319) under Greek Language)C# - 更改输入语言键盘布局(例如:在希腊语下设置希腊语 (319))
【发布时间】:2017-05-19 01:34:40
【问题描述】:

注意:输入语言和键盘布局不是一回事。一种输入语言可以有多种布局(例如:美国英语和 Dvorak、Dvorak Left 和 Dvorak Right)。

我正在编写一个程序,该程序将用于测试 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 属性。问题在于,相同输入语言(例如 Dvorak 和默认美国英语)的布局之间具有完全相同的文化信息(LCID 和 KeyboardLayoutID 均为 1033),但布局名称和句柄不同。但据我所知,更改应用程序语言的唯一方法是使用文化。

【问题讨论】:

  • Handle 属性具有有意义值的少数情况之一。将其转换为十六进制,您将看到模式,低字和高字都包含默认布局的 LCID。所以美国的 0x04090409。

标签: c# layout keyboard


【解决方案1】:

我用谷歌搜索了一些有效的代码,发布了答案以防有人需要此信息。 我不知道这段代码是什么意思,但它似乎有效。

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

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

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多