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

How to get the IME layout in C# Winform specially in Wndproc?

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

下面的代码总是给出韩语,但是当我select输入英文时它应该给出英文。

    [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 突出显示为英文输入。

我需要 WndProc 方法中的此信息。

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

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

您可以使用 Control.ImeMode 查找输入控件的 IME 模式(并使用 Control.ImeModeChanged 检查更改)。这将告诉您您使用的是韩文 - 韩文,还是韩文 - Alpha。 编辑:实际上,这只允许您强制执行给定设置,而不是读取 user-specified IME 模式,并且显然不应该使用。

更复杂的是,如果您启用了全局输入(自 Windows 8 起可用),输入配置不再存储 per-thread,而是全局的。在那种情况下 ImeMode 不起作用,并且被完全忽略。我认为您无法从应用程序方面对此做任何事情 - 设置不再由您查看或更改。根据 MSDN,正确的替代方法是 ImmGetConversionStatus 函数,但仅适用于桌面应用程序。