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

简介: 原文:c# windows程序调用本地输入法    好久没写博客了,今天写了一个DEMO,在WINform程序中调用本地输入法,并在窗体中显示出来。
原文: 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; }

目录
相关文章
|
3月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
184 2
|
30天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
87 13
|
3月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
268 0
|
4月前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
4月前
|
小程序 Windows
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
|
3月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
137 0
|
3月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
85 0
|
4月前
|
C# 容器
C#中的命名空间与程序集管理
在C#编程中,`命名空间`和`程序集`是组织代码的关键概念,有助于提高代码的可维护性和复用性。本文从基础入手,详细解释了命名空间的逻辑组织方式及其基本语法,展示了如何使用`using`指令访问其他命名空间中的类型,并提供了常见问题的解决方案。接着介绍了程序集这一.NET框架的基本单位,包括其创建、引用及高级特性如强名称和延迟加载等。通过具体示例,展示了如何创建和使用自定义程序集,并提出了针对版本不匹配和性能问题的有效策略。理解并善用这些概念,能显著提升开发效率和代码质量。
154 4
|
3月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
59 0
|
3月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
82 0

相关课程

更多