调用windows的API
//用户获取当前输入法句柄 [DllImport("imm32.dll")] public static extern IntPtr ImmGetContext(IntPtr hWnd); //用于获取当前输入法的状态 [DllImport("imm32.dll")] public static extern bool ImmGetConversionStatus(IntPtr hIMC, ref int conversion, ref int sentence); //用于设置输入法的状态 [DllImport("imm32.dll")] public static extern bool ImmSetConversionStatus(IntPtr hIMC, int conversion, int sentence);
有了这三个方法之后,设置系统的输入如法就很方便,下面是参数相关的一些内容
双打模式(包括单双混合,比如微软输入法)
输入法状态 | mode值 |
中文输入-半角-中文符号 | -2147482623 |
中文输入-全角-中文符号 | -2147482615 |
中文输入-半角-英文符号 | -2147483647 |
中文输入-全角-英文符号 | -2147483839 |
英文输入-半角-中文符号 | -2147482624 |
英文输入-全角-中文符号 | -2147482616 |
英文输入-半角-英文符号 | -2147483648 |
英文输入-全角-英文符号 | -2147483640 |
标准模式(全拼模式,比如智能ABC的标准模式)
输入法状态 | mode值 |
中文输入-半角-中文符号 | 1025 |
中文输入-全角-中文符号 | 1033 |
中文输入-半角-英文符号 | 1 |
中文输入-全角-英文符号 | 9 |
英文输入-半角-中文符号 | 1024 |
英文输入-全角-中文符号 | 1032 |
英文输入-半角-英文符号 | 0 |
英文输入-全角-英文符号 | 8 |
这样就可以设置我们想要设置的打字法模式了,下面是我的一个demo,当输入的是中文,就让打字法继续为中文输入模式,是英文就继续为英文模式
private void textBox1_TextChanged(object sender, EventArgs e) { Regex reg = new Regex(@"[\u4e00-\u9fa5]"); string temp = textBox1.Text; string lastStr = temp.Substring(temp.Length - 1, 1); IntPtr prt = ImmGetContext(this.Handle); int curIMode = 0; int curISentence = 0; ImmGetConversionStatus(prt,ref curIMode,ref curISentence); if (reg.IsMatch(lastStr)&&(curIMode!=1025||curISentence!=0)) { //如果是中文则切换成中文输入 int iMode = 1025; int iSentence = 0; if (!ImmSetConversionStatus(prt, iMode, iSentence)) { MessageBox.Show("change error"); } } else if(!reg.IsMatch(lastStr)&&(curIMode!=0||curISentence!=0)) { //是英文则切换成英文输入 int iMode = 0; int iSentence = 0; if (!ImmSetConversionStatus(prt, iMode, iSentence)) { MessageBox.Show("change error"); } } }