在开发多设备应用时,拥有一个虚拟键盘是至关重要的。Windows系统内置了一个虚拟键盘作为其易用性工具之一。但是,Windows的虚拟键盘功能有限,无法满足对功能和行为的更多控制需求,更不用说在此基础上构建新的任务了。本文将介绍如何为Windows构建一个可自定义的虚拟键盘。
曾为多个软件应用程序构建过虚拟键盘,但从未制作过一个完整的、包含101个以上键的键盘。最近,在项目中需要一个完整的虚拟键盘,并且可以控制它。因此,着手这个项目,在这里看到的就是工作成果。可以扩展它,根据需求进行构建。
构建虚拟键盘的关键在于使用SendKeys.Send方法。这个方法可以将按键发送到活动应用程序。例如,如果想点击一个按钮并发送TAB键,可以使用以下方法:
SendKeys.Send("{TAB}");
如果请求不代表有效的按键,代码中将会出现ArgumentException异常。
有时,需要发送多个字符才能得到一个特定的键。例如,要指定左括号,使用“{{}”。
SendKeys.Send("{(}");
加号(+)、尖括号(^)、百分号(%)、波浪号(~)和括号()对SendKeys有特殊含义。要指定这些字符之一,用大括号({})包围它。要指定当按下键时不显示字符的字符,如ENTER或TAB,以及代表动作而不是字符的键,必须使用特定的代码。例如:
SendKeys.Send("{MULTIPLY}"); // 数字键盘上的乘法键
SendKeys.Send("{ADD}"); // 数字键盘上的加法键
组合键,如CTRL + Key、SHIFT + Key和ALT + Key,可以通过使用尖括号(^)、加号(+)和百分号(%)来实现。要指定按住CTRL的同时按下S,然后不按SHIFT按下D,使用“^SD”。要指定按住SHIFT并按下A和B,使用“+(AB)”。
SendKeys.Send("^SD"); // CTRL + S 然后 D
SendKeys.Send("+(AB)"); // Shift + A 和 B
决定按照物理键盘的布局来进行。在Visual Studio中打开了一个新的C# Winforms项目,并根据物理键盘的布局添加了键。对于大多数键,可以使用按钮控件,除了这些特殊键,它们需要CheckBox控件:
所以,当CAPSLOCK键处于开启模式时,有一个被选中的CheckBox,它识别大写字母。CAPSLOCK关闭时创建小写字母的按键。对于有两个字符的键,如2(@)或7(&),必须检查SHIFT按钮的状态,并相应地生成正确的按键。SHIFT + 2应该发送@符号。类似的情况适用于组合键,如CTRL + C(复制)、CTRL + P(粘贴)等。
if (capslock.Checked || lshift.Checked || rshift.Checked) {
SendKeys.Send("B");
lshift.Checked = false;
rshift.Checked = false;
} else {
SendKeys.Send("b");
}
要识别任何复选框是否处于选中状态,使用背景颜色:
if (capslock.Checked == true) {
capslock.BackColor = System.Drawing.ColorTranslator.FromHtml("#0076D7");
} else capslock.BackColor = System.Drawing.ColorTranslator.FromHtml("#333333");
现在已经完全控制了虚拟键盘,想添加自定义键。想象一下自定义键作为一次性发送两个或更多字符的快捷方式。
一些更多的细节包括添加一行显示CAPS、Insert和NUM LOCK键状态的行。根据相应键的开启或关闭状态改变CAPS和NUM的标签的可见性。还添加了代码,以改变鼠标悬停在键上时键的背景颜色。
如果从窗体属性中选择None选项作为FormBorderStyle,将无法在屏幕上移动键盘并改变其位置。如果不介意标准的Windows边框,可以选择最适合口味和键盘使用的选择。
想去掉边框,拥有边框样式。所以做了以下操作:
现在已经拥有了颜色和临时边框,但是如何移动虚拟键盘呢?这里的诀窍需要Win32 API:
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
就这样!有一个具有自定义背景和边框样式的虚拟键盘,可以将其移动到屏幕上,并添加自定义键。