C# Winform制作虚拟键盘,支持中文

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文:C# Winform制作虚拟键盘,支持中文           最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下:        实现思路:          1  构建中文-拼音 数据库,我用的是SQ...
原文: C# Winform制作虚拟键盘,支持中文

          最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下:

       实现思路:

         1  构建中文-拼音 数据库,我用的是SQLite数据库,如

              

         2 构建布局,如效果图





代码:

  数据库代码文件  SqlHandler.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Configuration;
using System.IO;
using System.Reflection;
using System.Windows.Forms;


namespace TestKeyBord
{
 
    public class SqlHandler
    {
        public  static void InitSQLite(string db,string table)
        {
            try
            {
                DbName = db;
                TableName = table;

                if (CreateDataBase())
                {
                    _SQLiteCommand = _SQLiteConn.CreateCommand();
                    _SQLiteCommand.Connection = _SQLiteConn;
                    DesignerTable();
                }
            }
            catch
            {
              
            }
        }

        public static System.Data.ConnectionState SqliteState
        {
            get { return _SQLiteConn.State; }
        }


        #region 数据成员定义
        
        public static string DbName = "MedicalSystemLog";
        public static string TableName = "MedicalLog";
        public static string _SQLiteConnString = string.Empty;

        public static SQLiteConnection _SQLiteConn = new SQLiteConnection();
       
        public static SQLiteCommand _SQLiteCommand = new SQLiteCommand();
               
      
        #endregion

        #region 创建数据库文件

        public static bool CreateDataBase()
        {
            try
            {
                _SQLiteConnString = "Data Source=" + DbName + ".db";
                _SQLiteConn = new SQLiteConnection(_SQLiteConnString);
                _SQLiteConn.Open();
                _SQLiteCommand = _SQLiteConn.CreateCommand();
                _SQLiteCommand.Connection = _SQLiteConn;

                if (File.Exists(DbName + ".db"))
                {
                    return true;
                }
            }
            catch
            {
               // MessageBox.Show("日志系统加载失败!");
            }
            return false;
        }

        #endregion

        /// <summary>
        /// 矩阵是否连接
        /// </summary>
        public static bool MatrixIsConnected = false;


        #region 创建表
 

        public static void DesignerTable()
        {
            try
            {
                if (_SQLiteConn.State != System.Data.ConnectionState.Open)
                {
                    _SQLiteConn.Open();
                }

                List<string> list = new List<string> { };
                list.Add("ID VARCHAR(5)");//汉字ID
                list.Add("Chinese VARCHAR(5)");//汉字
                list.Add("English VARCHAR(10)");//拼音
                CreateTabel(TableName, list);
                list.Clear();
            }
            catch
            {
               // MessageBox.Show("创建日志数据库失败!");
            }
        }



        public static bool ClearSystemLog()
        {
            try
            {
                

                if (_SQLiteConn.State != System.Data.ConnectionState.Open)
                {
                    _SQLiteConn.Open();
                }

                if (_SQLiteConn.State == System.Data.ConnectionState.Open)
                {

                    _SQLiteCommand.CommandText = "delete from " + TableName + ";";
                    _SQLiteCommand.ExecuteNonQuery();

                }

                _SQLiteConn.Close();
            }
            
             catch (Exception ex)
             {
                   // MessageBox.Show("清除日志失败:" + ex.Message);
                    return false;
              }
            return true;
        }


     
        public static bool InsertData(string cn,string en,string id)
        {
            try
            {
               

                if (_SQLiteConn.State != System.Data.ConnectionState.Open)
                {
                    _SQLiteConn.Open();
                }

                if (_SQLiteConn.State == System.Data.ConnectionState.Open)
                {

                    _SQLiteCommand.CommandText = "insert into " + TableName + " values('" +
                       id + "','" + cn + "','" + en +  "');";
                    _SQLiteCommand.ExecuteNonQuery();

                }

                _SQLiteConn.Close();
            }
            catch (Exception ex)
            {
               // MessageBox.Show("日志写入失败:" + ex.Message);
                return false;
            }
            return true;
        }

      


        public static List<string[]> GetData(string en)
        {
            List<string[]> list = new List<string[]> { };

            try
            {

                _SQLiteCommand.CommandText = "select * from " + TableName + " where English='"+en+"';";

                using (SQLiteDataReader reader = _SQLiteCommand.ExecuteReader())
                {

                    string[] items = new string[] { };

                    while (reader.Read())
                    {
                        items = new string[]
                        { 
                            reader[0].ToString(),
                            reader[1].ToString(),
                            reader[2].ToString(),
                        };
                        list.Add(items);
                    }

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "=== GetDocInfo() ===" + ex.StackTrace);
            }
            return list;
        }


        public static List<string> GetZnData(string en)
        {

            en = en.ToLower(); ;

            List<string> list = new List<string> { };

            try
            {

                _SQLiteCommand.CommandText = "select * from " + TableName + " where English='" + en + "';";
             //  MessageBox.Show(_SQLiteCommand.CommandText);
                using (SQLiteDataReader reader = _SQLiteCommand.ExecuteReader())
                {

                    string[] items = new string[] { };

                    while (reader.Read())
                    {
                        
                        list.Add(reader["Chinese"].ToString());
                    }

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "=== GetDocInfo() 2222 ===" + ex.StackTrace);
            }
            return list;
        }

        public static void CreateTabel(string tableName,List<string> columes )
        {
            if (_SQLiteConn.State != System.Data.ConnectionState.Open)
            {
                _SQLiteConn.Open();
            }

            if (_SQLiteConn.State == System.Data.ConnectionState.Open)
            {
                
                string sql = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "';";
               
                _SQLiteCommand.CommandText = sql;

                if (Convert.ToInt32(_SQLiteCommand.ExecuteScalar()) == 0)//1表示存在,0表示不存
                {
                    sql = string.Empty;

                    foreach (string str in columes)
                    {
                        sql += str + ",";
                    }

                    _SQLiteCommand.CommandText = string.Format(
                        "CREATE TABLE {0} (" + sql.Substring(0, sql.Length - 1) + ")"
                        , tableName);

                    _SQLiteCommand.ExecuteNonQuery();
                    _SQLiteConn.Close();
                }

            }
            else
            {
                MessageBox.Show("创建表失败,请打开数据库!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        public static string PinConvert(string en) 
        {
            string data = "";
            string enLow = en.ToLower();
            for (int i = 0; i < enLow.Length; i++)
            {
                if (enLow[i].ToString() == "ā")
                {

                }
            }
            return data;
        }

        #endregion
    }
}

源码下载地址: http://download.csdn.net/detail/taoerit/9686889





更新 2017-2-13 ,还有个简单的方法 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace TestForm
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", EntryPoint = "keybd_event")]
        public static extern void keybd_event(
            byte bVk,                          //定义一个虚据拟键码。键码值必须在1~254之间。
            byte bScan,                        //定义该键的硬件扫描码
            int dwFlags,
            int dwExtraInfo
        );

        private void button1_Click(object sender, EventArgs e)
        {
            // 81 表示Q,具体看虚拟键盘表示码
            textBox1.Focus();
            keybd_event(81, 0, 0, 0);                      //Q压下
            keybd_event(81, 0, 0x02, 0);                   //Q弹起
        }
        
        public Form1()
        {
            InitializeComponent();
        }

 
        private void Form1_Load(object sender, EventArgs e)
        { 
        }

        
    }
}
 
 
虚拟键盘码









相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8月前
|
C#
C# WinForm发送Email邮件
C# WinForm发送Email邮件
C# WinForm发送Email邮件
|
8月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
176 0
|
8月前
C#WinForm基础编程(二)
C#WinForm基础编程
170 0
|
8月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
131 0
|
小程序 C#
C#WinForm实现Loading等待界面
上篇博客中解决了程序加载时屏幕闪烁的问题。 但是,加载的过程变得很缓慢。 这个给用户的体验也不是很好,我这里想加一个Loading的进度条。 项目启动的时候,加载进度条,界面UI加载完毕,进度条消失。
377 0
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
82 0
|
23天前
|
Linux C# iOS开发
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
53 12
|
4月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
3月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
311 0
|
3月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
179 0