自定义Windows虚拟键盘开发指南

开发多设备应用时,拥有一个虚拟键盘是至关重要的。Windows系统内置了一个虚拟键盘作为其易用性工具之一。但是,Windows的虚拟键盘功能有限,无法满足对功能和行为的更多控制需求,更不用说在此基础上构建新的任务了。本文将介绍如何为Windows构建一个可自定义的虚拟键盘。

曾为多个软件应用程序构建过虚拟键盘,但从未制作过一个完整的、包含101个以上键的键盘。最近,在项目中需要一个完整的虚拟键盘,并且可以控制它。因此,着手这个项目,在这里看到的就是工作成果。可以扩展它,根据需求进行构建。

构建虚拟键盘的关键方法

构建虚拟键盘的关键在于使用SendKeys.Send方法。这个方法可以将按键发送到活动应用程序。例如,如果想点击一个按钮并发送TAB键,可以使用以下方法:

SendKeys.Send("{TAB}");

如果请求不代表有效的按键,代码中将会出现ArgumentException异常。

注意事项

有时,需要发送多个字符才能得到一个特定的键。例如,要指定左括号,使用“{{}”。

SendKeys.Send("{(}");

加号(+)、尖括号(^)、百分号(%)、波浪号(~)和括号()对SendKeys有特殊含义。要指定这些字符之一,用大括号({})包围它。要指定当按下键时不显示字符的字符,如ENTER或TAB,以及代表动作而不是字符的键,必须使用特定的代码。例如:

SendKeys.Send("{MULTIPLY}"); // 数字键盘上的乘法键 SendKeys.Send("{ADD}"); // 数字键盘上的加法键

处理SHIFT、CTRL和ALT

组合键,如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
  • SHIFT
  • CTRL
  • ALT
  • NUM LOCK

所以,当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边框,可以选择最适合口味和键盘使用的选择。

想去掉边框,拥有边框样式。所以做了以下操作:

  • 将FormBorderStyle设置为None
  • 将所有的键放置在一个面板上,该面板位于主窗体上
  • 改变窗体的背景颜色,以与面板的背景颜色形成对比

现在已经拥有了颜色和临时边框,但是如何移动虚拟键盘呢?这里的诀窍需要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); } }

就这样!有一个具有自定义背景和边框样式的虚拟键盘,可以将其移动到屏幕上,并添加自定义键。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485