如何为WinCE的定制键盘写驱动
2009-02-12 20:40
295 查看
常看到有人问怎么给定制键盘制作驱动程序,在这里谈谈我的经验。完整的键盘驱动怎么写不是这篇文章的目的,这些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:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD目录下有一些针对标准键盘的源代码:DEVICELAYOUTS子目录下是Scan code到virtual key映射表,INPUTLANGS子目录下是virtual key到unicode映射表。具体做时主要是改这两张表,加上其他一些辅助代码编译成DLL。除此之外,WinCE还提供一个工具(D:\WINCE500\PUBLIC\COMMON\OAK\BIN\I386\kbdgen.exe),可以从Windows XP系统键盘驱动中提取映射表。比如下面命令生成法语键盘映射表的源代码:
kbdgen.exe kbdfr.dll -o kbd_040c -i 0000040C
结果输出三个文件:
kbd_040c.reg:注册表文件
kbd_040cDL.cpp:scan code -> virtual key映射表
kbd_040cIL.cpp:virtual key -> wide character映射表
键盘驱动名在注册表里[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts]可以查到,比如法语的locale是040C,在0000040c子键下可以找到驱动为kbdfr.dll。
scan code到virtual key(即device layout)在ScanCodeToVKeyTable数组里定义,一般不用改:
#define ScanCodeTableFirst 0x00
#define ScanCodeTableLast 0x8f
static UINT8 ScanCodeToVKeyTable[] =
映射表的修改过程大致如此。有了DLL还要在注册表中做些配置。在platform.reg中添加:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Layouts\0000040C]
"Layout File"="kbd_040c.dll"
"Layout Text"="French"
"PS2_AT"="kbd_040c.dll"
如果你同时支持英语和法语键盘,可以把法语设为第二键盘:
[HKEY_CURRENT_USER\Keyboard Layout\Preload\2]
@="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_USER\keyboard layout\toggle]
"Hotkey"="1"
在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:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD目录下有一些针对标准键盘的源代码:DEVICELAYOUTS子目录下是Scan code到virtual key映射表,INPUTLANGS子目录下是virtual key到unicode映射表。具体做时主要是改这两张表,加上其他一些辅助代码编译成DLL。除此之外,WinCE还提供一个工具(D:\WINCE500\PUBLIC\COMMON\OAK\BIN\I386\kbdgen.exe),可以从Windows XP系统键盘驱动中提取映射表。比如下面命令生成法语键盘映射表的源代码:
kbdgen.exe kbdfr.dll -o kbd_040c -i 0000040C
结果输出三个文件:
kbd_040c.reg:注册表文件
kbd_040cDL.cpp:scan code -> virtual key映射表
kbd_040cIL.cpp:virtual key -> wide character映射表
键盘驱动名在注册表里[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts]可以查到,比如法语的locale是040C,在0000040c子键下可以找到驱动为kbdfr.dll。
scan code到virtual key(即device layout)在ScanCodeToVKeyTable数组里定义,一般不用改:
#define ScanCodeTableFirst 0x00
#define ScanCodeTableLast 0x8f
static UINT8 ScanCodeToVKeyTable[] =
映射表的修改过程大致如此。有了DLL还要在注册表中做些配置。在platform.reg中添加:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Layouts\0000040C]
"Layout File"="kbd_040c.dll"
"Layout Text"="French"
"PS2_AT"="kbd_040c.dll"
如果你同时支持英语和法语键盘,可以把法语设为第二键盘:
[HKEY_CURRENT_USER\Keyboard Layout\Preload\2]
@="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_USER\keyboard layout\toggle]
"Hotkey"="1"
相关文章推荐
- 如何为WinCE的定制键盘写驱动——转载
- 如何为WinCE的定制键盘写驱动
- 如何为WinCE的定制键盘写驱动——转载
- 《如何为WinCE的定制键盘写驱动》
- 如何为WinCE的定制键盘写驱动
- 如何为WinCE的定制键盘写驱动
- 如何让定制的WinCE支持TFT屏幕
- 如何调试wince驱动(流驱动和本机驱动)
- 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)
- 如何编写Linux 下的 USB 键盘驱动
- 【求助】WINCE定制自己的SDK时如何加入POOM支持?
- 介绍一种wince 6.0 如何添加 640*480液晶驱动的好方法
- WINCE键盘驱动流程分析
- WinCE 5.0下鼠标键盘驱动分析
- 如何编写Linux下的USB键盘驱动
- 都来说说你是如何学习wince 驱动的(请大牛们也来凑凑热闹)
- wince下如何加载驱动
- WINCE键盘驱动流程不完全分析
- 应该如何学习wince驱动?
- 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)