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 进 ...
随机推荐
- strtok函数
strtok函数是cstring文件里的函数 strtok函数是cstring文件里的函数 其功能是截断字符串 原型为:char *strtok(char s[],const char *delin) ...
- ubuntu下spring环境搭建
一.安装JDK 下载官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 部署: ...
- 理解static关键字
1.static 变量是类变量,通过类名引用. 2.static 方法不需要针对某个对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接类名引用. 3.static 方法不能对非静态成员进行访问. ...
- 在win10 docker启动的centos容器中安装nginx
我是在win10机器上搭建了一个docker,在docker启动了centos容器,在centos中安装nginx. 安装配置docker 直接在官网下载docker for windows:http ...
- java集合的关系
在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...
- USACO44 TimeTravel 时间旅行(链表)
第一眼看到这题,woc,这不是主席树!?旁边HZ也表示同意,然后cGh队长就慢悠悠的过来:“想什么,USACO会有主席树!?” ↓打脸不解释,大家可以去%ta的博客(这样ta就不会D飞我了~)http ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...
- C++在循环内和循环外定义变量的差异
原文:http://blog.csdn.net/cashey1991/article/details/45127561 最后总结: 对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力 ...
- Python: PS 图像调整--亮度调整
本文用 Python 实现 PS 图像调整中的亮度调整,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/2 ...
- [USACO 2017DEC] Haybale Feast
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5142 [算法] 首先用RMQ预处理S数组的最大值 然后我们枚举右端点 , 通过二分求 ...