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 进 ...
随机推荐
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- web.xml中的ServletContextListener
要想了解ServletContextListener,先看看web.xml中的<listener>配置. 一)web.xml中的内容载入顺序: 首先能够肯定的是,载入顺序与它们在 web. ...
- 当你使用LINQ做底层时,最好设计一个工厂,不要把LINQ的动作暴露给业务层
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: ...
- 2016/3/1 淘宝 腾讯 网易 css初始化代码 以及最基础的初始化
淘宝官网(http://www.taobao.com/)样式初始化 body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, o ...
- 两大数相乘 -- javascript 实现
(function (){ var addLarge = function(n1,n2){ var carry = 0; var ret = ""; n1=n1.toString( ...
- RK3288 make otapackage 出错的问题【转】
本文转载自:http://blog.csdn.net/u010439962/article/details/51734631 Installed file list: out/target/produ ...
- 如何获取板子上独有的ID号EXYNOS4412/Imx6ul【转】
本文转载自:http://blog.csdn.net/u010871058/article/details/75637175 每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含 ...
- HDU1269 迷宫城堡 —— 强连通分量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) M ...
- 揭开自然拼读法(Phonics)的神秘面纱
揭开自然拼读法(Phonics)的神秘面纱 自然拼读法 (Phonics),是指看到一个单词,就可以根据英文字母在单词里的发音规律把这个单词读出来的一种方法.即从“字母发音-字母组合发音-单词-简单 ...
- Android控件之HorizontalScrollView 去掉滚动条
在默认情况下,HorizontalScrollView控件里面的内容在滚动的情况下,会出现滚动条,为了去掉滚动条, 只需要在<HorizontalScrollView/>里面加一句 and ...