在现代软件开发中,多语言支持是一个不可或缺的功能。对于需要在不同语言环境下使用键盘输入的场景,虚拟键盘提供了一个有效的解决方案。本文将介绍一款多语言虚拟键盘的开发过程,包括其背景、实现细节、使用技巧以及存在的问题。
最初,目标是手动创建自己的键盘布局,通过使用微软的虚拟键盘,逐个语言地进行。然而,在开始创建第三个键盘布局时,感到厌烦,并开始寻找读取现有布局的解决方案。在这个过程中,发现了一个在x86/x64系统上加载键盘时的bug。这个问题的解决方案可以在找到。这个应用使用了两种不同的kbd.h版本,一个用于x86,一个用于x64。
在键盘布局的加载和展示中,做了主要的工作。首先,定义了一个类来处理DLL布局的加载;称之为CKLL(键盘布局加载器)。LoadDLL函数用于加载键盘布局,然后使用GetCharFromSC函数根据扫描码和键盘状态检索VK_CHAR。
public struct VK_CHAR {
WCHAR wChar;
OSKState nState;
BOOL bDead;
};
键盘状态是常见修饰符的变体,包括普通、Shift、Alt、ShiftAlt、Ctrl、ShiftCtrl、CtrlAlt和ShiftCtrlAlt。
展示是通过一个名为CKeyboardStatic的CStatic派生类完成的。它有一个名为CKeyButton的子类,包含每个字符及其扫描码、字符和状态。键位的布局直接链接到OSKScanCodes数组,在本版本中使用了标准的qwerty布局。
const char OSKScanCodes[4][13] = {
{0x29, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D},
{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x00},
{0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2B, 0x00},
{0x56, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00}
};