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 进 ...
随机推荐
- Asp.net MVC 简单分页 自做简单分页
Asp.net MVC 简单分页: public static string Pager(int page,int pageSize,int total) { ...
- 高效5步走,高速搭建Hadoop2伪分布环境
前两天将Hadoop2的全然分布式搭建文档整理公布于网上(http://blog.csdn.net/aaronhadoop/article/details/24859369).朋友相邀.就再将Hado ...
- [数据集]新浪微博数据集MicroblogPCU
数据集下载地址:下载 摘要:MicroblogPCU是从新浪微博採集到的.它能够被用于研究机器学习方法和社会关系研究. 这个数据集被原作者用于探索微博中的spammers(发送垃圾信息的人).他们的d ...
- 【教程】怎样申请Chrome应用商店(Web Store)开发人员
首先你须要一张信用卡,假设你没有的话.能够借用父母或他人的(多见于学生党) 假设你有信用卡.你还得看看信用卡正面是否有注明"VISA"."MasterCard" ...
- HDU OJ u Calculate e
这是一道简单的数学计算问题 主义好输出格式就好 #include<stdio.h> int main() { printf("n e\n- -----------\n&quo ...
- POJ3694 Network —— 边双联通分量 + 缩点 + LCA + 并查集
题目链接:https://vjudge.net/problem/POJ-3694 A network administrator manages a large network. The networ ...
- YTU 2975: 我的编号
2975: 我的编号 时间限制: 1 Sec 内存限制: 128 MB 提交: 42 解决: 15 题目描述 建立一个学生链表,每个链表结点含有学生的基本信息,编号和姓名.现在n个学生站成一列,根 ...
- JFreeChart教程(二)(转)
JFreeChart教程(二) 分类: java Component2007-05-31 17:01 8408人阅读 评论(11) 收藏 举报 jfreechartstringplotclassdat ...
- js 弹出对话框的方法总结
原文:http://www.cnblogs.com/xiaofengfeng/archive/2012/10/20/2732784.html <!DOCTYPE html PUBLIC &quo ...
- I.MX6 i2c_data_write_byte ioctl error: I/O error
/************************************************************************* * I.MX6 i2c_data_write_by ...