C#编程之c# windows程序调用本地输入法
小标 2019-02-21 来源 : 阅读 2341 评论 0

摘要:本文主要向大家介绍了C#编程之c# windows程序调用本地输入法,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之c# windows程序调用本地输入法,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

C#编程之c# windows程序调用本地输入法

好久没写博客了,今天写了一个DEMO,在WINform程序中调用本地输入法,并在窗体中显示出来。其中使用到了很多API,现把代码贴出来,供大家参考


private string _CurrentImeHandleStr = "";
        public delegate bool EnumResNameProc(IntPtr hModule, IntPtr nType, StringBuilder sName, IntPtr lParam);
        System.ComponentModel.ComponentResourceManager resources = new ComponentResourceManager(typeof(Form17));
        public Form17()
        {
            InitializeComponent();
        }
        #region API定义
        
       
        private static readonly int BTN_HEIGHT = 21;
        private static readonly int IMAGE_ICON = 1;
        private const int DONT_RESOLVE_DLL_REFERENCES = 0x1;
        private const int LOAD_LIBRARY_AS_DATAFILE = 0x2;
        private const int LOAD_WITH_ALTERED_SEARCH_PATH = 0x8;
        private const int RT_ICON = 0x3;
        private const int RT_BITMAP = 0x2;
        private const int RT_GROUP_ICON = (RT_ICON + 11);

      //API定义
        [DllImport("Kernel32.dll")]
        public extern static bool FreeLibrary(IntPtr hModule);

        [DllImport("user32.dll")]
        public extern static IntPtr LoadIcon(IntPtr hInstance, string iID);
        /// <summary>
        /// 得到输入法说明
        /// </summary>
        /// <param name="Hkl"></param>
        /// <param name="sName"></param>
        /// <param name="nBuffer"></param>
        /// <returns></returns>
        [DllImport("Imm32.dll")]
        public extern static int ImmGetDescription(IntPtr Hkl, StringBuilder sName, int nBuffer);
        /// <summary>
        /// 得到输入法的文件名
        /// </summary>
        /// <param name="Hkl"></param>
        /// <param name="sFileName"></param>
        /// <param name="nBuffer"></param>
        /// <returns></returns>
        [DllImport("Imm32.dll")]
        public extern static int ImmGetIMEFileName(IntPtr Hkl, StringBuilder sFileName, int nBuffer);

        [DllImport("Kernel32.dll")]
        public extern static IntPtr LoadLibraryEx(string sFileName, IntPtr hFile, int dwFlags);

        [DllImport("Kernel32.dll")]
        public extern static bool EnumResourceNames(IntPtr hModule, IntPtr nType, EnumResNameProc lpEnumFunc, int lParam);

        [DllImport("shell32.dll")]
        public extern static IntPtr ExtractIcon(IntPtr hInstance, string sExeFileName, int nIconIndex);

        [DllImport("user32.dll")]
        public extern static IntPtr LoadImage(IntPtr hInstance, string sID, int nType, int cx, int cy, int fuLoad);
        #endregion

        private void Form17_Load(object sender, EventArgs e)
        {
            //初始化菜单
            InitMenus();
        }

        void Application_Idle(object sender, EventArgs e)
        {
            if (this._CurrentImeHandleStr == Application.CurrentInputLanguage.Handle.ToString())
                return;

            //显示新的输入法
            ChangeIme(Application.CurrentInputLanguage.Handle);
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        { 
          this.contextMenuStrip1.Show(this.toolStrip1, new Point(0, 0), ToolStripDropDownDirection.AboveRight);
        }
        /// <summary>
        /// 初始化菜单
        /// </summary>
        private void InitMenus()
        {
            this.contextMenuStrip1.Items.Clear();
            string sLayoutName = "";

            foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
            {
                sLayoutName = GetImmDescription(item);//item.LayoutName; //
                if (string.IsNullOrEmpty(sLayoutName))
                {
                    continue;
                }
                ToolStripMenuItem oMenuItem = new ToolStripMenuItem();
                oMenuItem.Checked = (item.Handle.ToString() == InputLanguage.CurrentInputLanguage.Handle.ToString());

                oMenuItem.Text = sLayoutName;
                oMenuItem.ToolTipText = sLayoutName;
                oMenuItem.Click += new EventHandler(oMenuItem_Click);
                oMenuItem.Tag = item;
                oMenuItem.Image = GetImeBitmap(item);
                this.contextMenuStrip1.Items.Add(oMenuItem);
            }
        }

        /// <summary>
        /// 得到指定输入法的说明
        /// </summary>
        /// <param name="hKl"></param>
        /// <returns></returns>
        private string GetImmDescription(InputLanguage inpt)
        {
            int nBuffer = 0;

            StringBuilder sName = new StringBuilder();
            string sDesc = "";

            nBuffer = ImmGetDescription(inpt.Handle, null, nBuffer);
            sName = new StringBuilder(nBuffer);
            ImmGetDescription(inpt.Handle, sName, nBuffer);
            sDesc = sName.ToString();
            if (string.IsNullOrEmpty(sDesc))
            {
                sDesc = inpt.LayoutName;
            }
      
            return sDesc;
        }

        /// <summary>
        /// 单击输入法事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void oMenuItem_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem oItem = (ToolStripMenuItem)sender;

            foreach (ToolStripMenuItem item in this.contextMenuStrip1.Items)
            {
                item.CheckState = CheckState.Unchecked;
            }
            oItem.CheckState = CheckState.Checked;

            Application.CurrentInputLanguage = ((InputLanguage)oItem.Tag);
            InputLanauageChangedUI();
        }

        /// <summary>
        /// 得到指定输入法的图标
        /// </summary>
        /// <param name="ime"></param>
        /// <returns></returns>
        private Image GetImeBitmap(InputLanguage ime)
        {
            int nBuffer = 0;
            StringBuilder sName;
            Image oBitmap = null;

            //得到IME文件
            nBuffer = ImmGetIMEFileName(ime.Handle, null, nBuffer);
            sName = new StringBuilder(nBuffer);
            ImmGetIMEFileName(ime.Handle, sName, nBuffer);

            if (string.IsNullOrEmpty(sName.ToString()))
            {
                return Properties.Resources.input;
   
            }
            else
            {
                //从资源文件中得到图标
                string sFileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sName.ToString());
                if (File.Exists(sFileName))
                {
                    oBitmap = GetBitmapFromResource(sFileName, "");
                }
                if (oBitmap == null)
                {
                    oBitmap = Properties.Resources.input;
                }
                return oBitmap;
            }
        }
        private Image GetBitmapFromResource(string sFileName, string sBitmapFlag)
        {
            Bitmap oBitmap = null;
            IntPtr hModule = LoadLibraryEx(sFileName, IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE);
            if (hModule == IntPtr.Zero)
            {
                System.Diagnostics.Debug.WriteLine("未能成功加载" + sFileName);
                return null;
            }
            string sName = "IMEICO";
            IntPtr hIcon = IntPtr.Zero;

            System.Diagnostics.Debug.WriteLine("正在获取" + sFileName + "中所有图标。");

         
            hIcon = ExtractIcon(this.Handle, sFileName, 0);
 
            if (hIcon == IntPtr.Zero)
            {
                sName = "#101";
                hIcon = LoadImage(hModule, sName, IMAGE_ICON, 16, 16, 0);
            }

            if (hIcon != IntPtr.Zero)
            {
                System.Diagnostics.Debug.WriteLine(string.Format("Hicon:{0}", hIcon.ToString()));
                oBitmap = Icon.FromHandle(hIcon).ToBitmap();
    
            }
         
            EnumResourceNames(hModule, this.MAKEINTRESOURCE(RT_GROUP_ICON), this.EnumIconResourceProc, 0);
            //释放
            FreeLibrary(hModule);
            return oBitmap;
        }
        private IntPtr MAKEINTRESOURCE(int nID)
        {
            return new IntPtr((long)((short)nID));
        }
        private bool EnumIconResourceProc(IntPtr hModule, IntPtr nType, StringBuilder sName, IntPtr lParam)
        {
            System.Diagnostics.Debug.WriteLine(string.Format("得到的资源名称:{0}", sName));
            //得到图标
            IntPtr hIcon = LoadIcon(hModule, sName.ToString());
            Icon icon = Icon.FromHandle(hIcon);

            return true;
        }
        private void Form17_InputLanguageChanged(object sender, InputLanguageChangedEventArgs e)
        {
            Application.CurrentInputLanguage = e.InputLanguage;
            this.ChangeIme(e.InputLanguage.Handle);

        }
        /// <summary>
        /// 改变输入法函数
        /// </summary>
        /// <param name="handle"></param>
        private void ChangeIme(IntPtr handle)
        {
            this._CurrentImeHandleStr = handle.ToString();
          
            //改变输入法的状态
            foreach (ToolStripMenuItem item in this.contextMenuStrip1.Items)
            {
                if (((InputLanguage)item.Tag).Handle.ToString() == handle.ToString())
                {
                    item.CheckState = CheckState.Checked;
                }
                else
                {
                    item.CheckState = CheckState.Unchecked;
                }
            }
            InputLanauageChangedUI();
        }

        /// <summary>
        /// 输入法改变时界面的变化
        /// </summary>
        private void InputLanauageChangedUI()
        {
            //改变相应的图标
            foreach (ToolStripMenuItem item in this.contextMenuStrip1.Items)
            {
                if (item.CheckState == CheckState.Checked)
                {
                    this.ToolBtn.Image = item.Image;
                    this.ToolBtn.ToolTipText = item.Text;
                  
                }
            }

            //重新设置组件的大小
            this.toolStrip1.Height = BTN_HEIGHT;
       
        }

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程