我有一个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;
}
是否有其他方法可以获取输入语言信息。
我希望在WndProc
方法中提供此信息。
问题总结: 所以我想处理用户通过切换按钮键入用户切换语言时的情况,当用户通过切换按钮切换语言时,我希望任何wndproc消息或窗口边事件获取语言信息。
答案 0 :(得分:0)
您的问题是IME模式和输入布局混淆的结果。在这两种情况下,您的输入布局都是韩语 - 您的IME模式会发生什么变化。
您可以使用编辑:实际上,这只允许你强制给定设置,而不是读取用户指定的IME模式,显然不应该'使用。Control.ImeMode
找到输入控件的IME模式(并使用Control.ImeModeChanged
检查更改)。这将告诉你,你要么是朝鲜语 - 韩文,要么是韩语 - 阿尔法。
更复杂的是,如果您启用了全局输入(自Windows 8起可用),其中输入配置不再按线程存储,而是全局。在这种情况下,ImeMode
不起作用,完全被忽略。我不认为从应用程序方面你可以做任何事情 - 设置不再是你的看到或改变。根据MSDN,正确的替换将是ImmGetConversionStatus功能,但仅适用于桌面应用程序。