用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
singlerace的公告
<h3>个人简介</h3><font color="#0000ff"> C/C++程序员,非典型游戏黑客;熟知X86、ARM汇编,爱好逆向工程。<BR>现从事基于Windows CE的嵌入式系统底层(BSP)开发。 </font> <h3>联系方式</h3><font color="#0000ff">EMAIL:</font><BR><img src=http://services.nexodyne.com/email/icon/iGHVAf3OxNp%2Bwg%3D%3D/QVIsWtc%3D/R01haWw%3D/0/image.png> <BR><font color="#0000ff">MSN:</font><BR><img src=http://services.nexodyne.com/email/icon/oBCoQTEBYQ%3D%3D/S2rk13w%3D/WWFob28%3D/0/image.png> <BR> <font color="#0000ff">在线联系我:</font><BR> <!-- Beginning of meebo me widget code. Want to talk with visitors on your page? Go to http://www.meebome.com/ and get your widget! --> <embed src="http://widget.meebo.com/mm.swf?ddZvdCHrDJ" type="application/x-shockwave-flash" wmode="transparent" width="160" height="250"></embed> <BR> <h3 class="listtitle">最近在读</h3><a href="http://www.douban.com/people/waterwalk/books"><img src=http://otho.douban.com/lpic/s2164877.jpg></a> <br><h3></h3> <script type="text/javascript"><!-- google_ad_client = "pub-1745683872576870"; google_ad_width = 110; google_ad_height = 32; google_ad_format = "110x32_as_rimg"; google_cpa_choice = "CAAQ2eOfnAIaCCIC8Vzxdpb-KOWkwXU"; google_ad_channel = ""; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-989049-1"; urchinTracker(); </script>
文章分类
我的程序
下载我的程序
友情链接
许式伟的专栏(RSS)
存档

原创  如何为WinCE的定制键盘写驱动 收藏

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

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

  1. 按键产生中断
  2. 键盘驱动读取按键的scan code
  3. 键盘驱动把scan code映射成virtual key和unicode字符
  4. 键盘驱动把按键消息发送到图形窗口子系统(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[] =
{
    
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_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"

发表于 @ 2009年02月12日 20:41:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:AUTORUN与数字签名(二) | 新一篇:把MAP文件导入IDA Pro的小程序

  • 发表评论
  • 评论内容:
  •  
Copyright © singlerace
Powered by CSDN Blog