c# 搜狗拼音输入法,刷输入速度和累计输入
阅读原文时间:2022年06月18日阅读:1

事件起因:

  搜狗拼音有几个称号(光速超人:要求最快打字速度 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、开始按钮单击事件,单击开始按钮后启动线程开始自动打字。同事禁用开始和下拉框

///

/// 开始按钮单击事件 ///
///
///
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、开始打字线程中使用了委托来设置按钮和下拉框的状态,这样可以使线程安全。同事定义设置按钮状态的安全方法以及设置下拉框的安全方法。

///

/// 定义委托 设置按钮的状态 ///
/// 按钮
/// false:禁用;true:启用
delegate void SetBtnEnabledDel(Button btn, bool b);
/// /// 定义委托 设置下拉框的状态 ///
/// 下拉框
/// false:禁用;true:启用
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。关闭窗体的时候清理窗体的子线程。

///

/// 停止按钮事件 ///
///
///
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 百度云盘

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章