事件起因:

  搜狗拼音有几个称号(光速超人:要求最快打字速度 200字/m,一代文豪:要求累计输入字数达200000)一直没有那么快的速度,就想用.net来实现。

相关技术:

  1、winform基本控件使用

  2、多线程开发

  3、C# Win32api函数调用

核心代码

  1、在窗体中放入两个按钮 分别名称为:开始(name:btnStart)  停止(btnStop)

  2、添加一个下拉框为 cbSpeend 输入速度下拉选项

  3、添加文本框命名为 txtInWord

  4、后台需要引用命名空间

  1. using System.Runtime.InteropServices;

  5、导入键盘输入方法SendInput,该方法包含了对键盘,鼠标,硬件输入的底层方法。定义代码如下

  1. //导入SendInput方法
  2. [DllImport("user32.dll")]
  3. public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);
  4.  
  5. //输入结构体
  6. [StructLayout(LayoutKind.Explicit)]
  7. public struct INPUT
  8. {
  9. [FieldOffset()]
  10. public Int32 type;
  11. [FieldOffset()]
  12. public KEYBDINPUT ki;
  13. [FieldOffset()]
  14. public MOUSEINPUT mi;
  15. [FieldOffset()]
  16. public HARDWAREINPUT hi;
  17. }
  18.  
  19. //鼠标输入结构体
  20. [StructLayout(LayoutKind.Sequential)]
  21. public struct MOUSEINPUT
  22. {
  23. public Int32 dx;
  24. public Int32 dy;
  25. public Int32 mouseData;
  26. public Int32 dwFlags;
  27. public Int32 time;
  28. public IntPtr dwExtraInfo;
  29. }
  30.  
  31. //键盘输入结构体
  32. [StructLayout(LayoutKind.Sequential)]
  33. public struct KEYBDINPUT
  34. {
  35. public Int16 wVk;
  36. public Int16 wScan;
  37. public Int32 dwFlags;
  38. public Int32 time;
  39. public IntPtr dwExtraInfo;
  40. }
  41.  
  42. //硬件输入结构体
  43. [StructLayout(LayoutKind.Sequential)]
  44. public struct HARDWAREINPUT
  45. {
  46. public Int32 uMsg;
  47. public Int16 wParamL;
  48. public Int16 wParamH;
  49. }
  50. //键盘输入
  51. public const int INPUT_KEYBOARD = ;

  6、定义软件中需要使用的基本变量,包含_flag是否继续输入,_thread当前打字的线程,_spend线程暂停的时间定义代码如下

  1. //定义状态
  2. bool _flag = true;
  3. //定义键盘输入的速度
  4. private int _spend = ;
  5. //定义线程
  6. private Thread _t;

  7、定义一个模型 Info 用于下拉框的数据源

  1. /// <summary>
  2. /// info下拉框数据源
  3. /// </summary>
  4. public class Info
  5. {
  6. public string Name { get; set; }
  7.  
  8. public string Id { get; set; }
  9. }

  8、初始化下拉框,在构造函数中初始化

  1. /// <summary>
  2. /// 构造函数
  3. /// </summary>
  4. public Form1()
  5. {
  6. InitializeComponent();
  7. btnStop.Enabled = false;
  8. //初始化下拉框
  9. IList<Info> infoList = new List<Info>();
  10. Info info1 = new Info() { Id = "", Name = "快速(200字/分)" };
  11. Info info2 = new Info() { Id = "", Name = "中速(120字/分)" };
  12. Info info3 = new Info() { Id = "", Name = "慢速(75字/分)" };
  13. infoList.Add(info1);
  14. infoList.Add(info2);
  15. infoList.Add(info3);
  16. cbSpeend.DataSource = infoList;
  17. cbSpeend.ValueMember = "Id";
  18. cbSpeend.DisplayMember = "Name";
  19. }

  9、开始按钮单击事件,单击开始按钮后启动线程开始自动打字。同事禁用开始和下拉框

  1. /// <summary>
  2. /// 开始按钮单击事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void btnStart_Click(object sender, EventArgs e)
  7. {
  8. _flag = true;
  9. btnStart.Enabled = false;
  10. cbSpeend.Enabled = false;
  11. btnStop.Enabled = true;
  12. _spend = int.Parse(cbSpeend.SelectedValue.ToString());
  13. //初始化线程
  14. _thread = new Thread(KeyBoardStart);
  15. _thread.IsBackground = true;
  16. _thread.Start();
  17. txtInWord.Focus();
  18. }
  19.  
  20. private void KeyBoardStart()
  21. {
  22. while (_flag)
  23. {
  24. try
  25. {
  26. //点击A键
  27. INPUT inDown = new INPUT();
  28. inDown.type = INPUT_KEYBOARD;
  29. inDown.ki.wVk = (int)Keys.A;
  30. SendInput(, ref inDown, Marshal.SizeOf(inDown));
  31. //点击空格键
  32. inDown = new INPUT();
  33. inDown.type = INPUT_KEYBOARD;
  34. inDown.ki.wVk = (int)Keys.Space;
  35. SendInput(, ref inDown, Marshal.SizeOf(inDown));
  36. //线程暂停
  37. Thread.Sleep(_spend);
  38. }
  39. catch (Exception ex)
  40. {
  41. MessageBox.Show(ex.Message);
  42. }
  43. }
  44.  
  45. MessageBox.Show(@"打字结束");
  46. //启用按钮开始
  47. SetBtnEnabled(btnStart, true);
  48. //禁用停止按钮
  49. SetBtnEnabled(btnStop, false);
  50. //启用下拉框
  51. SetComEnabled(cbSpeend, true);
  52. }

  10、开始打字线程中使用了委托来设置按钮和下拉框的状态,这样可以使线程安全。同事定义设置按钮状态的安全方法以及设置下拉框的安全方法。

  1. /// <summary>
  2. /// 定义委托 设置按钮的状态
  3. /// </summary>
  4. /// <param name="btn">按钮</param>
  5. /// <param name="b">false:禁用;true:启用</param>
  6. delegate void SetBtnEnabledDel(Button btn, bool b);
  7. /// <summary>
  8. /// 定义委托 设置下拉框的状态
  9. /// </summary>
  10. /// <param name="cb">下拉框</param>
  11. /// <param name="b">false:禁用;true:启用</param>
  12. delegate void SetComEnabledDel(ComboBox cb, bool b);
  13.  
  14. /// <summary>
  15. /// 设置下拉框的属性
  16. /// </summary>
  17. /// <param name="cb"></param>
  18. /// <param name="b"></param>
  19. private void SetComEnabled(ComboBox cb, bool b)
  20. {
  21. if (cb.InvokeRequired)
  22. {
  23. //在使用用委托调用自己
  24. SetComEnabledDel sbe = SetComEnabled;
  25. Invoke(sbe, cb, b);
  26. }
  27. else
  28. {
  29. cb.Enabled = b;
  30. }
  31. }
  32.  
  33. /// <summary>
  34. /// 设置按钮的状态
  35. /// </summary>
  36. /// <param name="btn"></param>
  37. /// <param name="b"></param>
  38. private void SetBtnEnabled(Button btn, bool b)
  39. {
  40. if (btn.InvokeRequired)
  41. {
  42. //在使用用委托调用自己
  43. SetBtnEnabledDel sbe = SetBtnEnabled;
  44. Invoke(sbe, btn, b);
  45. }
  46. else
  47. {
  48. btn.Enabled = b;
  49. }
  50. }

  11、定义停止按钮事件,需要将,输入状态改为false。关闭窗体的时候清理窗体的子线程。

  1. /// <summary>
  2. /// 停止按钮事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void btnStop_Click(object sender, EventArgs e)
  7. {
  8. _flag = false;
  9. }
  10.  
  11. /// <summary>
  12. /// 关闭窗体事件
  13. /// </summary>
  14. /// <param name="sender"></param>
  15. /// <param name="e"></param>
  16. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  17. {
  18. try
  19. {
  20. if (_thread != null)
  21. {
  22. //清除线程
  23. _thread.DisableComObjectEagerCleanup();
  24. }
  25. }
  26. catch (Exception ex)
  27. {
  28. MessageBox.Show(ex.Message);
  29. }
  30. }

功能截图:

  1、首先运行程序

  2、将输入发切换到中文

  3、选择速度开始自动打字  

源码下载地址:

  http://pan.baidu.com/s/1i3Ek4b7 百度云盘

c# 搜狗拼音输入法,刷输入速度和累计输入的更多相关文章

  1. 搜狗拼音输入法 V9.1.0.2589 最新去广告精简优化版

    搜狗拼音输入法9.0 正式版例行发布,最新版字母代号b,详细版本号为v9.1.0.2589:搜狗拼音输入法是电脑装机必备软件,版本有传统版和智慧版之分,其打字超准.词库超大.速度飞快.外观漂亮,因此使 ...

  2. 在 Linux 中使用搜狗拼音输入法以及搞定 Flash 和支付宝

    在 Ubuntu 中安装搜狗输入法 在 Ubuntu Kylin 系统中,默认安装搜狗拼音输入法,但是在原生 Ubuntu 系统中则不是.这可以理解,毕竟搜狗输入法的 Linux 版有 Kylin 团 ...

  3. [] ubuntu 14.04 搜狗拼音输入法安装

    1.需要现在ubuntu下安装fcitx和libssh2-1命令如下 sudo apt-get install fcitx sudo apt-get install libssh2-1 注意最好是先卸 ...

  4. ubuntu彻底卸载搜狗拼音输入法

    ubuntu彻底卸载搜狗拼音输入法,ubuntu安装搜狗输入法后如果觉得搜狗不是很适合自己,那应该怎么样彻底的卸载搜狗输入法呢?下面我们就来一步步彻底卸载掉搜狗输入法... 方法/步骤 1 找到安装的 ...

  5. ubuntu安装配置搜狗拼音输入法

    进入下载目录,在终端执行安装 $sudo dpkg  -i   sogou_pinyin_linux_1.0.0.0033_amd64.deb 安装过程会出现 依赖关系问题 2 修复依赖关系完成搜狗拼 ...

  6. Ubuntu下安装搜狗拼音输入法

    Ubuntu默认输入法是ibus输入法,其实用着也可以了,但是说句实话在某些情况下真的不怎么智能.习惯了搜狗所以,查阅资料测试成功后整理如下, 1.安装搜狗拼音 sudo apt-add-reposi ...

  7. ubuntu 14.04 安装搜狗拼音输入法

    原文:ubuntu 14.04 安装搜狗拼音输入法 ubuntu桌面系统下终于有了好用的拼音法-搜狗拼音输入法,欲在ubuntu 14.04下安装搜狗拼音输入法相当的简单. 先到搜狗拼音官网下载对应的 ...

  8. Ubuntu系统上安装搜狗拼音输入法sogou

    1. 首先在百度搜索搜狗拼音输入法Linux就能看到它的官网:http://pinyin.sogou.com/linux/ 下载后直接安装.安装成功后在控制台输入 im-config 如果选中的是fc ...

  9. 英文版Ubuntu安装配置搜狗拼音输入法

    下载搜狗输入法 1 进入搜狗输入法官网,进入上面导航兰的 "输入法Linux版"   2 根据你安装的ubuntu是32位还是64位下载 END ubuntu安装搜狗输入法 1 进 ...

随机推荐

  1. linux nginx service nginx restart [fail]

    命令:nginx -t 查看失败原因: nginx: [emerg] "fastcgi_pass" directive is duplicate in /etc/nginx/sit ...

  2. vs2010下配置CUDA出现kernel launch failed问题,内核无效

    首先, 推荐一篇不错的配置文档~手把手教你 CUDA 5.5与VS2010编译环境的搭建.笔者就是在这篇文章的指导下成功地在VS2010上搭建了CUDA 6.5~ 其次. 文末给出的执行演示样例不好使 ...

  3. hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场

    pid=4970">Killing Monsters                                                                   ...

  4. 【java】itoo项目实战之hibernate 懒载入优化性能

    在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加 ...

  5. 关于MySQL的TPS和QPS

    TPS - Transactions Per Second(每秒传输的事物处理个数),这是指server每秒处理的事务数,支持事务的存储引擎如InnoDB等特有的一个性能指标. 计算方法: TPS = ...

  6. is id() == 从内存的最小化占用角度解释 我是孕育者,我也应该这样设计 变,必然伴随着加法 一个list是否可以执行set()

    def f(a, b): print(a is b, b is a, a == b, a.__eq__(b), id(a), id(b)) f(2, 2) f([2], [2]) f('2', '2' ...

  7. Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  8. poj2154Color polya定理+欧拉函数优化

    没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻 ...

  9. YTU 2838: 改错题AB-装置连接

    2838: 改错题AB-装置连接 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 49 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. 有AB ...

  10. hibernate 的缓存机制

    这是面试中经常问到的一个问题,楼主可以按照我的思路回答,准你回答得很完美,首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具 ...