以文本方式查看主題 - 曙海教育集團論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- WinCE系統定制與驅動開發 (http://www.xinguifushi.cn/bbs/list.asp?boardid=36) ---- 如何為WinCE的定制鍵盤寫驅動 (http://www.xinguifushi.cn/bbs/dispbbs.asp?boardid=36&id=1817) |
-- 作者:wangxinxin -- 發布時間:2010-11-26 10:49:40 -- 如何為WinCE的定制鍵盤寫驅動 常看到有人問怎么給定制鍵盤制作驅動程序,在這里談談我的經驗。完整的鍵盤驅動怎么寫不是這篇文章的目的,這些MSDN上有很詳細的介紹。這里談的是,舉個例子,標準的美國英語鍵盤的數字鍵SHIFT+2輸出符號@,你想改成歐元符號該怎么做?或者你想做一個法語鍵盤,又該怎么做?又或者你想基于同樣的鍵盤硬件設計,軟件上同時支持英語、法語、俄語layout,又該怎么弄? 在WinCE上,從鍵盤驅動的角度看,鍵盤驅動對按鍵動作的響應過程大約可描述為: 按鍵產生中斷 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:注冊表文件 鍵盤驅動名在注冊表里[HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Keyboard Layouts]可以查到,比如法語的locale是040C,在0000040c子鍵下可以找到驅動為kbdfr.dll。 scan code到virtual key(即device layout)在ScanCodeToVKeyTable數組里定義,一般不用改: #define ScanCodeTableFirst 0x00 }; 定制的重點是修改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[] = { }; static VK_TO_WCHARS5 aVkToWch5[] = { }; 映射表的修改過程大致如此。有了DLL還要在注冊表中做些配置。在platform.reg中添加: [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Layouts\\0000040C] 如果你同時支持英語和法語鍵盤,可以把法語設為第二鍵盤: 甚至還可以設置熱鍵在運行時切換鍵盤: |