原文:
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) { } } }
虚拟键盘码