c# 搜狗拼音输入法,刷输入速度和累计输入
事件起因:
搜狗拼音有几个称号(光速超人:要求最快打字速度 200字/m,一代文豪:要求累计输入字数达200000)一直没有那么快的速度,就想用.net来实现。
相关技术:
1、winform基本控件使用
2、多线程开发
3、C# Win32api函数调用
核心代码
1、在窗体中放入两个按钮 分别名称为:开始(name:btnStart) 停止(btnStop)
2、添加一个下拉框为 cbSpeend 输入速度下拉选项
3、添加文本框命名为 txtInWord
4、后台需要引用命名空间
using System.Runtime.InteropServices;
5、导入键盘输入方法SendInput,该方法包含了对键盘,鼠标,硬件输入的底层方法。定义代码如下
//导入SendInput方法
[DllImport("user32.dll")]
public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize); //输入结构体
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset()]
public Int32 type;
[FieldOffset()]
public KEYBDINPUT ki;
[FieldOffset()]
public MOUSEINPUT mi;
[FieldOffset()]
public HARDWAREINPUT hi;
} //鼠标输入结构体
[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
{
public Int32 dx;
public Int32 dy;
public Int32 mouseData;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
} //键盘输入结构体
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public Int16 wVk;
public Int16 wScan;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
} //硬件输入结构体
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
{
public Int32 uMsg;
public Int16 wParamL;
public Int16 wParamH;
}
//键盘输入
public const int INPUT_KEYBOARD = ;
6、定义软件中需要使用的基本变量,包含_flag是否继续输入,_thread当前打字的线程,_spend线程暂停的时间定义代码如下
//定义状态
bool _flag = true;
//定义键盘输入的速度
private int _spend = ;
//定义线程
private Thread _t;
7、定义一个模型 Info 用于下拉框的数据源
/// <summary>
/// info下拉框数据源
/// </summary>
public class Info
{
public string Name { get; set; } public string Id { get; set; }
}
8、初始化下拉框,在构造函数中初始化
/// <summary>
/// 构造函数
/// </summary>
public Form1()
{
InitializeComponent();
btnStop.Enabled = false;
//初始化下拉框
IList<Info> infoList = new List<Info>();
Info info1 = new Info() { Id = "", Name = "快速(200字/分)" };
Info info2 = new Info() { Id = "", Name = "中速(120字/分)" };
Info info3 = new Info() { Id = "", Name = "慢速(75字/分)" };
infoList.Add(info1);
infoList.Add(info2);
infoList.Add(info3);
cbSpeend.DataSource = infoList;
cbSpeend.ValueMember = "Id";
cbSpeend.DisplayMember = "Name";
}
9、开始按钮单击事件,单击开始按钮后启动线程开始自动打字。同事禁用开始和下拉框
/// <summary>
/// 开始按钮单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
_flag = true;
btnStart.Enabled = false;
cbSpeend.Enabled = false;
btnStop.Enabled = true;
_spend = int.Parse(cbSpeend.SelectedValue.ToString());
//初始化线程
_thread = new Thread(KeyBoardStart);
_thread.IsBackground = true;
_thread.Start();
txtInWord.Focus();
} private void KeyBoardStart()
{
while (_flag)
{
try
{
//点击A键
INPUT inDown = new INPUT();
inDown.type = INPUT_KEYBOARD;
inDown.ki.wVk = (int)Keys.A;
SendInput(, ref inDown, Marshal.SizeOf(inDown));
//点击空格键
inDown = new INPUT();
inDown.type = INPUT_KEYBOARD;
inDown.ki.wVk = (int)Keys.Space;
SendInput(, ref inDown, Marshal.SizeOf(inDown));
//线程暂停
Thread.Sleep(_spend);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} MessageBox.Show(@"打字结束");
//启用按钮开始
SetBtnEnabled(btnStart, true);
//禁用停止按钮
SetBtnEnabled(btnStop, false);
//启用下拉框
SetComEnabled(cbSpeend, true);
}
10、开始打字线程中使用了委托来设置按钮和下拉框的状态,这样可以使线程安全。同事定义设置按钮状态的安全方法以及设置下拉框的安全方法。
/// <summary>
/// 定义委托 设置按钮的状态
/// </summary>
/// <param name="btn">按钮</param>
/// <param name="b">false:禁用;true:启用</param>
delegate void SetBtnEnabledDel(Button btn, bool b);
/// <summary>
/// 定义委托 设置下拉框的状态
/// </summary>
/// <param name="cb">下拉框</param>
/// <param name="b">false:禁用;true:启用</param>
delegate void SetComEnabledDel(ComboBox cb, bool b); /// <summary>
/// 设置下拉框的属性
/// </summary>
/// <param name="cb"></param>
/// <param name="b"></param>
private void SetComEnabled(ComboBox cb, bool b)
{
if (cb.InvokeRequired)
{
//在使用用委托调用自己
SetComEnabledDel sbe = SetComEnabled;
Invoke(sbe, cb, b);
}
else
{
cb.Enabled = b;
}
} /// <summary>
/// 设置按钮的状态
/// </summary>
/// <param name="btn"></param>
/// <param name="b"></param>
private void SetBtnEnabled(Button btn, bool b)
{
if (btn.InvokeRequired)
{
//在使用用委托调用自己
SetBtnEnabledDel sbe = SetBtnEnabled;
Invoke(sbe, btn, b);
}
else
{
btn.Enabled = b;
}
}
11、定义停止按钮事件,需要将,输入状态改为false。关闭窗体的时候清理窗体的子线程。
/// <summary>
/// 停止按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
_flag = false;
} /// <summary>
/// 关闭窗体事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (_thread != null)
{
//清除线程
_thread.DisableComObjectEagerCleanup();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
功能截图:
1、首先运行程序
2、将输入发切换到中文
3、选择速度开始自动打字


源码下载地址:
http://pan.baidu.com/s/1i3Ek4b7 百度云盘
c# 搜狗拼音输入法,刷输入速度和累计输入的更多相关文章
- 搜狗拼音输入法 V9.1.0.2589 最新去广告精简优化版
搜狗拼音输入法9.0 正式版例行发布,最新版字母代号b,详细版本号为v9.1.0.2589:搜狗拼音输入法是电脑装机必备软件,版本有传统版和智慧版之分,其打字超准.词库超大.速度飞快.外观漂亮,因此使 ...
- 在 Linux 中使用搜狗拼音输入法以及搞定 Flash 和支付宝
在 Ubuntu 中安装搜狗输入法 在 Ubuntu Kylin 系统中,默认安装搜狗拼音输入法,但是在原生 Ubuntu 系统中则不是.这可以理解,毕竟搜狗输入法的 Linux 版有 Kylin 团 ...
- [] ubuntu 14.04 搜狗拼音输入法安装
1.需要现在ubuntu下安装fcitx和libssh2-1命令如下 sudo apt-get install fcitx sudo apt-get install libssh2-1 注意最好是先卸 ...
- ubuntu彻底卸载搜狗拼音输入法
ubuntu彻底卸载搜狗拼音输入法,ubuntu安装搜狗输入法后如果觉得搜狗不是很适合自己,那应该怎么样彻底的卸载搜狗输入法呢?下面我们就来一步步彻底卸载掉搜狗输入法... 方法/步骤 1 找到安装的 ...
- ubuntu安装配置搜狗拼音输入法
进入下载目录,在终端执行安装 $sudo dpkg -i sogou_pinyin_linux_1.0.0.0033_amd64.deb 安装过程会出现 依赖关系问题 2 修复依赖关系完成搜狗拼 ...
- Ubuntu下安装搜狗拼音输入法
Ubuntu默认输入法是ibus输入法,其实用着也可以了,但是说句实话在某些情况下真的不怎么智能.习惯了搜狗所以,查阅资料测试成功后整理如下, 1.安装搜狗拼音 sudo apt-add-reposi ...
- ubuntu 14.04 安装搜狗拼音输入法
原文:ubuntu 14.04 安装搜狗拼音输入法 ubuntu桌面系统下终于有了好用的拼音法-搜狗拼音输入法,欲在ubuntu 14.04下安装搜狗拼音输入法相当的简单. 先到搜狗拼音官网下载对应的 ...
- Ubuntu系统上安装搜狗拼音输入法sogou
1. 首先在百度搜索搜狗拼音输入法Linux就能看到它的官网:http://pinyin.sogou.com/linux/ 下载后直接安装.安装成功后在控制台输入 im-config 如果选中的是fc ...
- 英文版Ubuntu安装配置搜狗拼音输入法
下载搜狗输入法 1 进入搜狗输入法官网,进入上面导航兰的 "输入法Linux版" 2 根据你安装的ubuntu是32位还是64位下载 END ubuntu安装搜狗输入法 1 进 ...
随机推荐
- STM32 USB复合设备编写
目的 完成一个CDC + MSC的复合USB设备 可以方便在CDC,MSC,复合设备三者间切换 可移植性强 预备知识 cube中USB只有两个入口. main函数中的MX_USB_DEVICE_Ini ...
- url加密并计算时间
将URL地址参数进行加密传输提高网站安全性 加密算法,直接调用就好 function keyED($txt,$encrypt_key){ $encrypt_key = md5($encrypt_key ...
- python 【第三篇】函数基础
深浅拷贝 set是一个无序且不重复的元素集合访问速度快天生解决重复问题 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #深浅拷贝 import copy ...
- HDFS集中式缓存管理(Centralized Cache Management)
Hadoop从2.3.0版本号開始支持HDFS缓存机制,HDFS同意用户将一部分文件夹或文件缓存在HDFS其中.NameNode会通知拥有相应块的DataNodes将其缓存在DataNode的内存其中 ...
- 2016/05/25 Ajax 跨域 转
起因: 起因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统:调用A系统以B为例.在B系统 中用ajax调用A系统系统的接口(数据格式为 ...
- iOS开发——高级篇——iOS开发之网络安全密码学
一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...
- 【bzoj2809】[Apio2012]dispatching (左偏树)
我们需要枚举根,然后从其子树内选尽量多的点,薪水不超过M,可是暴力复杂度不对.于是考虑自下而上合并树(开始每棵树内只有一个节点,就是自己) 每个树是一个堆,我们维护树的节点个数和薪水总和,合并时,不断 ...
- net start sshd 发生系统错误1069--cygwin安装过程
net start sshd 发生系统错误1069 解决方法: services.msc调出服务,然后CYGWIN sshd服务->属性,修改账户的名字和密码(win7的登录名和密码) 可能还遇 ...
- Flame Graphs
http://www.brendangregg.com/flamegraphs.html Flame graphs are a visualization of profiled software, ...
- Lightoj 1019 - Brush (V)
算出从点1到点n的最短路径. /* *********************************************** Author :guanjun Created Time :2016 ...