如何在 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 函数,但仅适用于桌面应用程序。
我有一个 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 模式发生了变化。
您可以使用 编辑:实际上,这只允许您强制执行给定设置,而不是读取 user-specified IME 模式,并且显然不应该使用。Control.ImeMode
查找输入控件的 IME 模式(并使用 Control.ImeModeChanged
检查更改)。这将告诉您您使用的是韩文 - 韩文,还是韩文 - Alpha。
更复杂的是,如果您启用了全局输入(自 Windows 8 起可用),输入配置不再存储 per-thread,而是全局的。在那种情况下 ImeMode
不起作用,并且被完全忽略。我认为您无法从应用程序方面对此做任何事情 - 设置不再由您查看或更改。根据 MSDN,正确的替代方法是 ImmGetConversionStatus 函数,但仅适用于桌面应用程序。