C# Winform制作虚拟键盘,支持中文
原文链接:https://blog.csdn.net/taoerit/article/details/53037637,支持原创,转载学习
最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下:
实现思路:
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)
 - {
 - }
 - }
 - }
 
- <span style="color:#ff0000;">虚拟键盘码</span>
 

                    
                
                
            
        
浙公网安备 33010602011771号