我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来获取输入语言信息.
我想在WndProc
方法中提供这些信息.
问题总结:所以我想处理当用户切换语言通过切换按钮键入时的情况,当用户通过切换按钮切换语言时,我希望任何wndproc消息或窗口边事件获取语言信息.
您的问题是 IME 模式和输入布局混淆造成的。在这两种情况下,您的输入布局都是韩语 - 改变的是您的 IME 模式。
您可以使用查找输入控件的 IME 模式编辑:实际上,这仅允许您强制给定设置,而不读取用户指定的 IME 模式,并且显然不应该使用。Control.ImeMode
(并使用 检查更改Control.ImeModeChanged
)。这会告诉您您使用的是韩语 - Hangul,或者韩语 - Alpha。
更复杂的是,如果您启用了全局输入(自 Windows 8 起可用),其中输入配置不再按线程存储,而是全局的。在这种情况下ImeMode
不起作用,并且被完全忽略。我不认为您可以从应用程序方面对此做任何事情 - 该设置不再由您查看或更改。根据 MSDN 的说法,正确的替代方法是ImmGetConversionStatus函数,但仅适用于桌面应用程序。