winform 如何控制输入法

简介: 原文:winform 如何控制输入法在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的。对此,在这里做个备录 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找 开始正文 1、先...
原文: winform 如何控制输入法

在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的。对此,在这里做个备录

这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找

开始正文

1、先介绍本文会用到的windows的API,网上有很详细的资料,我这里就只简要说明一下

  ImmGetContext(IntPtr hwnd):获取当前正在输入的窗口的输入法句柄

  ImmSetOpenStatus(IntPtr himc, bool b):设置输入法的状态

  InputLanguage类:提供方法和字段以管理输入语言;这是winform里面自带的输入法管理类,msdn上有详细资料

2、比如本系统安装有两个输入法:搜狗拼音智能 ABC(注意:智能 ABC中间有个空格,用下划线就是要明确对比出来)。

3、使用InputLanguage类来显示指定的输入法。

  思路很简单:先获取到操作系统中安装的所有输入法列表,然后循环列表,比对指定的输入法名称(名称可以设置在配置文件中,安装的时候,根据不同人的需要配置成不同的输入法),然后把找到的输入法设为当前输入法,代码如下:

  

            //设置“搜狗拼音”为当前输入法
            foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
            {
                if (item.LayoutName.Contains("搜狗拼音"))
                {
                    InputLanguage.CurrentInputLanguage = item;
                    break;
                }
            }

            //设置“智能 ABC”为当前输入法
            foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
            {
                if (item.LayoutName.Contains("智能 ABC"))
                {
                    InputLanguage.CurrentInputLanguage = item;
                    break;
                }
            }

            //设置系统默认输入法为当前输入法
            InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;

3、解决输入法被禁用的假象。

  思路也很简单,只需要重新激活输入法就行了,这里就用到上面的API方法了。

  首先声明一个委托:

  

        private delegate void fixImeDele();
        private fixImeDele _fixime;

  然后定义委托要实现的事情。

            fixime = delegate
            {
                IntPtr HIme = ImmGetContext(this.Handle);
                ImmSetOpenStatus(HIme, true);
            };

  最后执行委托就行了哦。

this.BeginInvoke(fixime);

最后完整代码如下:

    public partial class Form1 : Form
    {
        [DllImport("imm32.dll")]
        public static extern IntPtr ImmGetContext(IntPtr hwnd);//获取当前正在输入的窗口的输入法句柄
        [DllImport("imm32.dll")]
        public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//设置输入法的状态

        private delegate void fixImeDele();
        private fixImeDele fixime;

        public Form1()
        {
            InitializeComponent();


        }

        

        private void txt搜狗拼音_Enter(object sender, EventArgs e)
        {
            //int index = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage);
            //设置“搜狗拼音”为当前输入法
            foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
            {
                if (item.LayoutName.Contains("搜狗拼音"))
                {
                    InputLanguage.CurrentInputLanguage = item;
                    break;
                }
            }

        }
        
        private void textBox3_Enter(object sender, EventArgs e)
        {
            //设置“智能 ABC”为当前输入法
            foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
            {
                if (item.LayoutName.Contains("智能 ABC"))
                {
                    InputLanguage.CurrentInputLanguage = item;
                    break;
                }
            }
        }

        private void txt系统默认_Enter(object sender, EventArgs e)
        {
            //设置系统默认输入法为当前输入法
            InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
        }

        private void txtTrue_Enter(object sender, EventArgs e)
        {
            fixime = delegate
            {
                IntPtr HIme = ImmGetContext(this.Handle);
                ImmSetOpenStatus(HIme, true);
            };
            this.BeginInvoke(fixime);


        }

        private void txtFalse_Enter(object sender, EventArgs e)
        {
            fixime = delegate
            {
                IntPtr HIme = ImmGetContext(this.Handle);
                ImmSetOpenStatus(HIme, false);
            };
            this.BeginInvoke(fixime);
        }
    }
View Code

 

目录
相关文章
|
Unix 编译器 Linux
CMake Install:深度解析与实践(一)
CMake Install:深度解析与实践
992 0
|
2月前
|
网络协议 网络安全 API
C# 与三菱FX5U PLC通讯交互指南
C# 与三菱FX5U PLC通讯交互指南
983 121
|
存储 SQL 大数据
带你读《Apache Doris 案例集》—— 01 招商信诺人寿 基于 Apache Doris 统一 OLAP 技术栈实践(1)
带你读《Apache Doris 案例集》—— 01 招商信诺人寿 基于 Apache Doris 统一 OLAP 技术栈实践(1)
357 0
|
2月前
|
存储 SQL 机器学习/深度学习
ClickHouse不止于快:它在AI领域悄悄做了这些大事!
在第16届中国数据库技术大会(DTCC2025)大会上,ClickHouse Inc技术总监王鹏程,根据自己和团队在ClickHouse的技术实践经历,发表了题为《ClickHouse在AI领域的进展和应用》的主题演讲,分享了ClickHouse在现代数据架构中的创新应用,特别是在向量搜索、智能代理分析、机器学习数据管理等关键领域的突破。本文由ITPUB整理,经王鹏程老师授权发布。以下为演讲实录。
310 0
ClickHouse不止于快:它在AI领域悄悄做了这些大事!
|
3月前
|
人工智能 运维 BI
Top5 主流工单管理系统全对比(2025 版):功能、价格、行业适配性详解
在数字化浪潮推动下,工单管理系统已成为企业提升运营效率、优化客户体验的关键工具。本文解析其核心价值与选型要点,并对合力亿捷、Zendesk、Freshdesk、Jira Service Management、钉钉宜搭五大主流系统进行多维度对比,涵盖功能、价格、行业适配性等,助力企业精准选型,加速数字化转型进程。
|
7月前
|
数据采集 人工智能 自然语言处理
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
ChildMandarin是由智源研究院与南开大学联合推出的开源语音数据集,包含41.25小时3-5岁儿童普通话语音数据,覆盖中国22个省级行政区,为儿童语音识别和语言发展研究提供高质量数据支持。
796 20
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
|
8月前
|
存储 分布式数据库 Apache
小米基于 Apache Paimon 的流式湖仓实践
小米基于 Apache Paimon 的流式湖仓实践
208 0
小米基于 Apache Paimon 的流式湖仓实践
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
530 2
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
4651 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
1330 0