原文: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)
{
} }
}

虚拟键盘码


C# Winform制作虚拟键盘,支持中文的更多相关文章

  1. C# WinForm制作电子琴键盘

    上一篇 http://hovertree.com/h/bjaf/y8qol2p4.htm 再上一篇的基础上,使用WinForm制作了一个电子琴键盘: 演示地址 http://hovertree.com ...

  2. 利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片

    利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片.代码如下 import java.awt.Color;import java.io.File;import java.util.H ...

  3. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》--本系列完结

    8.虚拟键盘实现 概述: 硬键盘就是物理键盘,平时敲的那种.软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上.虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可 ...

  4. Xcode6.1模拟器ios8.1模拟器不能弹出虚拟键盘及虚拟键盘无法切换中文输入的解决办法

    1.不能弹出虚拟键盘的解决办法 模拟器菜单Hardware->Keyboard->Connect Hardware Keyboard取消选中,快捷键commad+shift+K 2.虚拟键 ...

  5. [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘

    Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异.   Cocos2D-x使用CCKeypadDeleg ...

  6. 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop

    [源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...

  7. Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法

    前言 我在实验进入linux系统启动xwindow server而不启动KDE GNOME等桌面系统时遇到的问题.只启动x server而不启动桌面系统,在xserver之上运行一个全屏的图形界面程序 ...

  8. 隐藏虚拟键盘,解决键盘挡住UITextField问题

    再正式开始之前,先来介绍一下IOS的键盘类型: 一.键盘风格 UIKit框架支持8种风格键盘 ? 1 2 3 4 5 6 7 8 9 10 typedef enum {      UIKeyboard ...

  9. 收起虚拟键盘的各种方法 -- IOS

    使用虚拟键盘来输入资讯,是 iOS 的重要互动方式之一,虚拟键盘通常会自动出现在可以编辑的 UITextField 或是 UITextView 的编辑事件中,叫出键盘固然容易,但是要把它收起来,可就没 ...

随机推荐

  1. [Angular Unit Testing] Shallow Pipe Testing

    import { TestBed, ComponentFixture } from '@angular/core/testing'; import { BrowserDynamicTestingMod ...

  2. ios开发事件处理之 :二:事件的产生与传递

    1.事件是怎么样产生与传递的? 当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.(队列是先进先出,而栈是先进后出) UIApplication会从事件队列中 ...

  3. [CSS] Change the auto-placement behaviour of grid items with grid-auto-flow

    We can change the automatic behaviour of what order our grid items appear. We can even re-order the ...

  4. [React] Public Class Fields with React Components

    Public Class Fields allow you to add instance properties to the class definition with the assignment ...

  5. HDU 5044 Tree(树链剖分)

    HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...

  6. 【codeforces 782D】 Innokenty and a Football League

    [题目链接]:http://codeforces.com/contest/782 [题意] 每个队名有两种选择, 然后第一个选择队名相同的那些队只能选第二种; 让你安排队名 [题解] 首先全都选成第一 ...

  7. Linux初接触设置笔记01

    没事装Linux尝试一下,来来回回装无数次,把刚开始需要设置的东西自己收藏一下,针对Centos7 装完Centos默认会覆盖windows引导,所以首先要做的是恢复windows的引导,如果不恢复, ...

  8. 【codeforces 791C】Bear and Different Names

    [题目链接]:http://codeforces.com/contest/791/problem/C [题意] 给你n-k+1个限制 要求 a[i]..a[i]+k-1里面有相同的元素,或全都不同; ...

  9. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  10. 5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good

    本节讲解SpringBoot与Spring-data-elasticsearch整合的入门案例. 一.环境搭建 新建maven项目,名字随意 pom.xml <parent> <gr ...