我有一个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消息或窗口边事件来获取语言信息.
解决方法
您的问题是IME模式和输入布局混乱的结果.您的输入布局在两种情况下都是韩文 – 您的IME模式有哪些变化.
您可以使用Control.ImeMode找到输入控件的IME模式(并使用Control.ImeModeChanged检查更改).这将告诉你,你是韩国人,韩国人,还是韩国人 – 阿尔法人.编辑:实际上,这只允许你强制给定的设置,而不是读取用户指定的IME模式,显然不应该使用.
进一步的复杂性是,如果您启用了全局输入(Windows 8可用),其中输入配置不再存储在每个线程中,而是全局的.在这种情况下,ImeMode不起作用,完全被忽略.我不认为从应用程序方面你可以做任何事情 – 这个设置已经不再是你的看法或者改变了.根据MSDN,适当的更换将是ImmGetConversionStatus功能,但仅适用于桌面应用程序.