《如何为WinCE的定制键盘写驱动》

常看到有人问怎么给定制键盘制作驱动程序,在这里谈谈我的经验。完整的键盘驱动怎么写不是这篇文章的目的,这些MSDN上有很详细的介绍。这里谈的是,举个例子,标准的美国英语键盘的数字键SHIFT+2输出符号@,你想改成欧元符号该怎么做?或者你想做一个法语键盘,又该怎么做?又或者你想基于同样的键盘硬件设计,软件上同时支持英语、法语、俄语layout,又该怎么弄?

  在WinCE上,从键盘驱动的角度看,键盘驱动对按键动作的响应过程大约可描述为:

  按键产生中断

  键盘驱动读取按键的scan code

  键盘驱动把scan code映射成virtual key和unicode字符

  键盘驱动把按键消息发送到图形窗口子系统(GWES)。

  键的scan code由keyboard matrix决定,跟键盘的硬件设计有关。因此从软件角度看,键盘的scan code是不能改的。但是由于按键最终输出的是可打印字符或者virtual key,这里面就有个映射关系,这个映射关系可以在键盘驱动理指定,甚至可以动态切换。WinCE的标准键盘驱动框架定义了两张映射表:即Scan code到virtual key的映射表(Device layout),和virtual key到unicode的映射表(input language)。通过修改这两张映射表的定义,我们就可以控制键盘上的每一个按键或者按键组合的输出。

  D:WINCE500PUBLICCOMMONOAKDRIVERSKEYBD目录下有一些针对标准键盘的源代码:DEVICELAYOUTS子目录下是Scan code到virtual key映射表,INPUTLANGS子目录下是virtual key到unicode映射表。具体做时主要是改这两张表,加上其他一些辅助代码编译成DLL。除此之外,WinCE还提供一个工具(D:WINCE500PUBLICCOMMONOAKBINI386kbdgen.exe),可以从Windows XP系统键盘驱动中提取映射表。比如下面命令生成法语键盘映射表的源代码:

kbdgen.exekbdfr.dll-okbd_040c-i0000040C

  结果输出三个文件:

  kbd_040c.reg:注册表文件

  kbd_040cDL.cpp:scan code -> virtual key映射表

  kbd_040cIL.cpp:virtual key -> wide character映射表

  键盘驱动名在注册表里[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlKeyboard Layouts]可以查到,比如法语的locale是040C,在0000040c子键下可以找到驱动为kbdfr.dll。

  scan code到virtual key(即device layout)在ScanCodeToVKeyTable数组里定义,一般不用改:

#define ScanCodeTableFirst 0x00
#define ScanCodeTableLast  0x8f
static UINT8 ScanCodeToVKeyTable[] =
……{
  0,   // Scan Code 0x0
  VK_F9, // Scan Code 0x1
  0,   // Scan Code 0x2
  VK_F5, // Scan Code 0x3
  VK_F3, // Scan Code 0x4
  VK_F1, // Scan Code 0x5
  VK_F2, // Scan Code 0x6
  VK_F12, // Scan Code 0x7
  0,   // Scan Code 0x8
  VK_F10, // Scan Code 0x9
  VK_F8, // Scan Code 0xA
  VK_F6, // Scan Code 0xB
……
};

  有时候你可能想知道键盘上每个键对应的scan code,你可以在键盘驱动KeybdPdd_GetEventEx2函数中用RETAILMSG把scan code打印出来。

  定制的重点是修改virtual key到unicode映射表,即 aVkToWch1~aVkToWch5等几个数组,欧洲语言键盘还要改aDeadKey数组,这几个数组控制各种组合按键输出,比如用户按下A, Shift+A, Ctrl+Shift+A, Dead key+A,分别输出什么东西 。

举例来说,标准美语键盘SHIFT+2输出@,你想改成欧元符号€。先查出€的unicode值为20AC(利用MS Office的symbol对话框),然后修改aVkToWch2数组:

static VK_TO_WCHARS2 aVkToWch2[] = {
 ……{'2'     ,0   ,'2'   ,0x20ac   },
……
};

  如果你同时还想让CTRL+ALT+2输出§(unicode 00A7),那么要改aVkToWch5而不是aVkToWch2:

static VK_TO_WCHARS5 aVkToWch5[] = ……{
 ……{'2'     ,0 ,'2'   ,0x20ac   ,WCH_NONE ,0x0000  ,0xb9  },
……
};

  映射表的修改过程大致如此。有了DLL还要在注册表中做些配置。在platform.reg中添加:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLayouts000040C]
  "Layout File"="kbd_040c.dll"
  "Layout Text"="French"
  "PS2_AT"="kbd_040c.dll"

  如果你同时支持英语和法语键盘,可以把法语设为第二键盘:

[HKEY_CURRENT_USERKeyboard LayoutPreload2]
  @="0000040C"

  甚至还可以设置热键在运行时切换键盘:

;Enabling ALT+SHIFT keyboard layout toggle short cut key
; "Hotkey"="1" => ALT+SHIFT
; "Hotkey"="2" => CTRL+SHIFT
; "Hotkey"="3" => None
; The toggle key is disabled even if the key is not defined.
[HKEY_CURRENT_USERkeyboard layouttoggle]
  "Hotkey"="1"

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值