如何在Wndproc中专门在C#Winform中获取IME布局?

时间:2017-02-08 09:23:20

标签: c# winforms ime

我有一个winform应用程序,我想在C#中获取当前输入语言的信息。我有windows 10机器,我选择了韩语。在我选择韩语后,任务栏中有一个切换按钮可将输入语言更改为英语或韩语。

以下代码总是提供韩语,但在我选择英语输入时应该提供英语。

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess);
    [DllImport("user32.dll")]
    static extern IntPtr GetKeyboardLayout(uint thread);
    public Form1()
    {
        InitializeComponent();
        IntPtr foregroundWindow = GetForegroundWindow();
        uint foregroundProcess = GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero);
        int keyboardLayout = GetKeyboardLayout(foregroundProcess).ToInt32() & 0xFFFF;
        CultureInfo info = new CultureInfo(keyboardLayout);
        int keyboardLayoutId = info.KeyboardLayoutId;
        string name = info.Name;
    }

是否有其他方法可以获取输入语言信息。

您可以找到相同的附加图像。我强调A作为英语输入。 TaskBar Screenshot English Input

TaskBar Screenshot Korean Input

我希望在WndProc方法中提供此信息。

问题总结: 所以我想处理用户通过切换按钮键入用户切换语言时的情况,当用户通过切换按钮切换语言时,我希望任何wndproc消息或窗口边事件获取语言信息。

1 个答案:

答案 0 :(得分:0)

您的问题是IME模式和输入布局混淆的结果。在这两种情况下,您的输入布局都是韩语 - 您的IME模式会发生什么变化。

您可以使用Control.ImeMode找到输入控件的IME模式(并使用Control.ImeModeChanged检查更改)。这将告诉你,你要么是朝鲜语 - 韩文,要么是韩语 - 阿尔法。编辑:实际上,这只允许你强制给定设置,而不是读取用户指定的IME模式,显然不应该'使用。

更复杂的是,如果您启用了全局输入(自Windows 8起可用),其中输入配置不再按线程存储,而是全局。在这种情况下,ImeMode不起作用,完全被忽略。我不认为从应用程序方面你可以做任何事情 - 设置不再是你的看到或改变。根据MSDN,正确的替换将是ImmGetConversionStatus功能,但仅适用于桌面应用程序。