C# 输入法
虽说输入法不是什么新事物,各种语言版本都有,不过在C#不常见;这就会给人一种误会:C#不能做!其实C#能不能做呢,答案是肯定的——三种方式都行:IMM、TSF以及外挂式。IMM这种就是调windows的一些底层api,不过在新版本的windows中基本上已经不能用了,属于一种过时的操作方式。TSF是微软推荐的一种新方式,不过相对C#资料太少;线上主要的一些都是针对C++的版本资料,当然可以作为借鉴来实现C#版的。我这里主要介绍一种外挂式的(天啦撸,C#可以写外挂?),对于高手来说肯定不值一提,不过也算是实现了外挂及输入法!题外话——C#可以做外挂么?答案是可以的,C#针对windows的api编程资料还是很多的,下面就简单的介绍一下面可能要使用到的api:
安装了一个钩子,截取鼠标键盘等信号
public static extern int SetWindowsHookEx( int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
停止使用钩子
publicstatic extern bool UnhookWindowsHookEx(intidHook);
通过信息钩子继续下一个钩子
publicstatic extern int CallNextHookEx(intidHook, int nCode, Int32 wParam, IntPtr lParam);
线程钩子需要用到
static extern int GetCurrentThreadId();
使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效
publicstatic extern IntPtr GetModuleHandle(stringname);
转换指定的虚拟键码和键盘状态的相应字符或字符
public static extern int ToAscii(int uVirtKey, //[in] 指定虚拟关键代码进行翻译。
int uScanCode, // [in] 指定的硬件扫描码的关键须翻译成英文。高阶位的这个值设定的关键,如果是(不压)
byte[] lpbKeyState, // [in] 指针,以256字节数组,包含当前键盘的状态。每个元素(字节)的数组包含状态的一个关键。如果高阶位的字节是一套,关键是下跌(按下)。在低比特,如果设置表明,关键是对切换。在此功能,只有肘位的CAPS LOCK键是相关的。在切换状态的NUM个锁和滚动锁定键被忽略。
byte[] lpwTransKey, // [out] 指针的缓冲区收到翻译字符或字符。
int fuState);
1.有了以上的这些api基本上就可能实现鼠标键盘的监控或者锁定等;那么首先要安装钩子:
// 安装键盘钩子 public void Start() { if (hKeyboardHook == 0) { KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); //如果SetWindowsHookEx失败 if (hKeyboardHook == 0) { Stop(); throw new Exception("安装键盘钩子失败"); } } }
2.安装完后就要对获取到钩子进行处理:
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { // 侦听键盘事件 if (nCode >= 0 && wParam == 0x0100) { KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); #region 开关 if (MyKeyboardHookStruct.vkCode == 20 || MyKeyboardHookStruct.vkCode == 160 || MyKeyboardHookStruct.vkCode == 161) { isLocked = isLocked ? false : true; } #endregion #region if (isLocked) { if (isStarted && MyKeyboardHookStruct.vkCode >= 48 && MyKeyboardHookStruct.vkCode = 65 && MyKeyboardHookStruct.vkCode = 65 && MyKeyboardHookStruct.vkCode <p>上面一些数字,对于刚入门的同学来说也不是什么问题,一看就明白是对哪些键做的操作。</p><p><span style="font-size:14pt">3.停止钩子</span></p><pre class="brush:php;toolbar:false"> 1 public void Stop() 2 { 3 bool retKeyboard = true; 4 5 6 if (hKeyboardHook != 0) 7 { 8 retKeyboard = UnhookWindowsHookEx(hKeyboardHook); 9 hKeyboardHook = 0;10 }11 12 if (!(retKeyboard))13 throw new Exception("卸载钩子失败!");14 }
4.注册事件
1 private void WordBoard_Load(object sender, EventArgs e)2 {3 Program.keyBordHook.KeyUpEvent += KeyBordHook_KeyUpEvent;4 Program.keyBordHook.OnSpaced += KeyBordHook_OnSpaced;5 Program.keyBordHook.OnBacked += KeyBordHook_OnBacked;6 }
5.根据输入内容显示并进行转换
1 private void ShowCharatar() 2 { 3 this.listView1.BeginInvoke(new Action(() => 4 { 5 label1.Text = keys; 6 7 try 8 { 9 this.listView1.Items.Clear();10 var arr = CacheHelper.Get(keys);11 if (arr != null)12 for (int i = 0; i 10 ? 9 : arr.Length); i++)13 {14 this.listView1.Items.Add((i + 1) + "、" + arr[i]);15 }16 }17 catch18 {19 label1.Text = keys = "";20 }21 }));22 }
6.显示输入
1 private void KeyBordHook_KeyUpEvent(object sender, KeyEventArgs e)2 {3 keys += e.KeyCode.ToString().ToLower();4 this.ShowCharatar();5 }
7.空格上屏
1 private void KeyBordHook_OnSpaced(int choose) 2 { 3 try 4 { 5 if (CacheHelper.ContainsKey(keys)) 6 { 7 if (choose > 0) 8 { 9 choose = choose - 1;10 }11 12 Program.keyBordHook.Send(CacheHelper.Get(keys)[choose]);13 label1.Text = "";14 this.listView1.Clear();15 }16 }17 catch18 {19 20 }21 keys = "";22 }
8.将数据发送到激活的输入框中
1 public void Send(string msg)2 {3 if (!string.IsNullOrEmpty(msg))4 {5 Stop();6 SendKeys.Send("{RIGHT}" + msg);7 Start();8 }9 }
9.back键回退
1 private void KeyBordHook_OnBacked()2 {3 if (!string.IsNullOrEmpty(keys))4 {5 keys = keys.Substring(0, keys.Length - 1);6 }7 this.ShowCharatar();8 }
当然这里还可以使其他键来完善更多的功能,例如拼音的分页处理等
至于什么五笔、拼音就要使用词库来解决了;其中五笔比较简单,拼音就非常复杂了,各种分词、联想等...这里以五笔为主,拼音为单拼来实现基本的输入功能;所以不需要什么高深算法,简单使用MemoryCache就轻松高效搞定
10.键词转换
1 /***************************************************************************************************** 2 * 本代码版权归@wenli所有,All Rights Reserved (C) 2015-2017 3 ***************************************************************************************************** 4 * CLR版本:4.0.30319.42000 5 * 唯一标识:8ebc884b-ee5f-45de-8638-c054b832e0ce 6 * 机器名称:WENLI-PC 7 * 联系人邮箱:wenguoli_520@qq.com 8 ***************************************************************************************************** 9 * 项目名称:$projectname$ 10 * 命名空间:Wenli.IEM 11 * 类名称:CacheHelper 12 * 创建时间:2017/3/3 16:18:14 13 * 创建人:wenli 14 * 创建说明: 15 *****************************************************************************************************/ 16 using System; 17 using System.Collections.Generic; 18 using System.IO; 19 using System.Linq; 20 using System.Runtime.Caching; 21 using System.Text; 22 using System.Windows.Forms; 23 24 namespace Wenli.IEM.Helper 25 { 26 public static class CacheHelper 27 { 28 static MemoryCache _wubiCache = new MemoryCache("wubi"); 29 30 static MemoryCache _pinyinCache = new MemoryCache("pinyin"); 31 32 static CacheHelper() 33 { 34 var path = Application.StartupPath + "\\Win32\\world.dll"; 35 var arr = File.ReadAllLines(path); 36 foreach (string item in arr) 37 { 38 var key = item.Substring(0, item.IndexOf(" ")); 39 var value = item.Substring(item.IndexOf(" ") + 1); 40 _wubiCache.Add(key, (object)value, DateTimeOffset.MaxValue); 41 } 42 43 // 44 45 path = Application.StartupPath + "\\Win32\\pinyin.dll"; 46 arr = File.ReadAllLines(path); 47 foreach (string item in arr) 48 { 49 var key = item.Substring(0, item.IndexOf(" ")); 50 var value = item.Substring(item.IndexOf(" ") + 1); 51 _pinyinCache.Add(key, (object)value, DateTimeOffset.MaxValue); 52 } 53 } 54 55 public static string[] Get(string key) 56 { 57 if (!string.IsNullOrEmpty(key)) 58 { 59 var str = string.Empty; 60 61 try 62 { 63 if (_wubiCache.Contains(key)) 64 str = _wubiCache[key].ToString(); 65 } 66 catch { } 67 try 68 { 69 if (_pinyinCache.Contains(key)) 70 str += " " + _pinyinCache[key].ToString(); 71 } 72 catch { } 73 74 if (!string.IsNullOrEmpty(str)) 75 { 76 var arr = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 77 for (int i = 0; i -1) 80 { 81 arr[i] = arr[i].Substring(0, arr[i].IndexOf("*")); 82 } 83 } 84 return arr; 85 } 86 } 87 88 return null; 89 } 90 91 92 public static bool ContainsKey(string key) 93 { 94 if (_wubiCache.Contains(key)) 95 return true; 96 if (_pinyinCache.Contains(key)) 97 return true; 98 return false; 99 }100 101 public static void Clear()102 {103 _wubiCache.Dispose();104 GC.Collect(-1);105 }106 }107 }
到此一个基本型的C#版外挂输入法就成功完成了
以上是C# 關於輸入法的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

有些小伙伴对于win11的输入法悬浮窗功能非常不习惯,使用起来总是怪怪的,因此想要关闭这个悬浮窗功能,现在就给大家介绍一下win11系统下关闭悬浮窗的正确操作方法,一起跟着操作吧。win11隐藏输入法悬浮窗1、打开电脑的设置键,然后选择“时间和语言“,进入之后再点击”输入“2、在“高级键盘设置”里找到“切换输入法”,然后把“桌面语言栏”前的勾点上,再进入“语言栏选项”3、打开后,我们点击这里的“隐藏“就可以把语言悬浮窗给关掉了。

win10系统是最新款,很多的功能都还没有完善,容易出现一些小bug,给小伙伴们带来了许多的小烦恼,下面就带大家一起来学习一下如何解决切换输入法时很卡的问题。win10系统如何解决无法切换输入法很卡1、点击“开始”按键,打开“设置”2、点击右侧“时间和语言”3、点击左侧窗口“语言”4、点击右侧窗口输入法中的“选项”5、找到“微软拼音”点击“选项”6、点击左侧窗口“词库和自学习”7、将“云候选择”中的开关关闭即可

Win10输入法不见了如何调出来?我们日常中都会使用电脑进行学习和娱乐,使用的过程中都会用到打字功能,但是近期有小伙伴在使用的过程中发现输入法无法调出来了,这种情况我们无法正常的使用电脑。那么应该如何解决呢,小编下面整理了Win10输入法不见了找回办法,感兴趣的话,跟着小编一起往下看看吧!Win10输入法不见了找回办法1、点击右下角的开始菜单,点击“设置”选项,进入windows设置,如图所示。2、在弹出页面中,选择“时间和语言”选项,选择左侧的”语言“选项,如图所示。3、在语言中找到”拼写、键

win11输入法打字不显示选字框怎么解决?详情近期有很多用户在打字的时候出现了这个问题,输入的内容就会出现比较多的错别字,那么要怎么做才能够显示选字框,我们可以对键盘进行设置来开启显示,针对这个问题,本期win11教程小编就来和广大用户们分享解决方法,一起来看看完整的操作步骤吧。win11输入法打字不显示选字框怎么解决:1、如果是微软输入法,可以点击右下角输入法图标,打开更多键盘设置。3、接着点击微软输入法右边三个点打开键盘选项。5、最后打开最下面的兼容性选项即可。

win11输入法能够帮助我们快速打字,但是如果调不出输入法就无法打字了,那么win11输入法不见了无法打字应该怎么解决呢,其实只要在系统里打开它即可。win11输入法不见了无法打字:1、首先右键“此电脑”打开“管理”2、然后在左边打开“任务计划程序库”3、然后进入“Microsoft”下的“Windows”选项。4、再找到下面的“TextServicesFramework”5、最后右键右边的任务,并选择“运行”就可以解决了。

如果我们打字没有选字框,就不知道自己要打的那个字在什么位置了,当然也就无法正常打字了,那么win11电脑输入法打字不显示选字框怎么解决呢。win11电脑输入法打字不显示选字框:1、如果是微软输入法,可以点击右下角“输入法图标”,打开“更多键盘设置”2、然后点击中文最右边“三个点”打开“语言选项”3、接着点击微软输入法右边“三个点”打开“键盘选项”4、随后选择第一个“常规”5、最后打开最下面的“兼容性”选项即可。

输入法指键盘的输入编码方式,输入方式有很多种,手写、拼音、五笔等待,现在也衍生出很多输入法软件,如果我们的输入法图标不见了该怎么办呢?下面。我们一起来看看解决方法。1、以win7系统为例说明打开控制面板,将控制面板的查看方式改为“大图标”,找到“区域和语言”选项打开。2、在区域和语言窗口中切换到“键盘和语言”选项,点击“更改键盘”铵钮,进入下一步。3、在文本服务和输入语言窗口切换到“语言栏”选项。然后点击“停靠于任务栏”选项,点击应用并确定即可。4、回到桌面,我们就可以在任务栏的右侧看到输入法图

有用户安装win11后,发现win11输入法打不出汉字全部是字母,这可能是由于微软拼音的兼容性问题导致的。win11输入法打不出汉字全部是字母:1、首先点击下方“Windows徽标”2、接着打开其中的“设置”3、然后点击左边栏的“时间和语言”4、随后进入“语言和区域”选项。5、进入后,点击“简体中文”右边“三个点”,打开“语言选项”6、再找到“微软拼音”,点击右边“...”,打开“键盘选项”7、随后点击最上方的“常规”选项。8、最后打开下方的“兼容性”再重启电脑就可以了。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器