gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:50:00 24 4
gpt4 key购买 nike

我有一个 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 消息或窗口端事件获取语言信息。

最佳答案

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

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

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

关于c# - 如何在 Wndproc 中专门获取 C# Winform 中的 IME 布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com