以文本方式查看主題 - 曙海教育集團(tuán)論壇 (http://www.hufushizhe.com/bbs/index.asp) -- WinCE系統(tǒng)定制與驅(qū)動(dòng)開(kāi)發(fā) (http://www.hufushizhe.com/bbs/list.asp?boardid=36) ---- 如何為WinCE的定制鍵盤寫驅(qū)動(dòng) (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=36&id=1817) |
-- 作者:wangxinxin -- 發(fā)布時(shí)間:2010-11-26 10:49:40 -- 如何為WinCE的定制鍵盤寫驅(qū)動(dòng) 常看到有人問(wèn)怎么給定制鍵盤制作驅(qū)動(dòng)程序,在這里談?wù)勎业慕?jīng)驗(yàn)。完整的鍵盤驅(qū)動(dòng)怎么寫不是這篇文章的目的,這些MSDN上有很詳細(xì)的介紹。這里談的是,舉個(gè)例子,標(biāo)準(zhǔn)的美國(guó)英語(yǔ)鍵盤的數(shù)字鍵SHIFT+2輸出符號(hào)@,你想改成歐元符號(hào)該怎么做?或者你想做一個(gè)法語(yǔ)鍵盤,又該怎么做?又或者你想基于同樣的鍵盤硬件設(shè)計(jì),軟件上同時(shí)支持英語(yǔ)、法語(yǔ)、俄語(yǔ)layout,又該怎么弄? 在WinCE上,從鍵盤驅(qū)動(dòng)的角度看,鍵盤驅(qū)動(dòng)對(duì)按鍵動(dòng)作的響應(yīng)過(guò)程大約可描述為: 按鍵產(chǎn)生中斷 D:\\WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\KEYBD目錄下有一些針對(duì)標(biāo)準(zhǔn)鍵盤的源代碼:DEVICELAYOUTS子目錄下是Scan code到virtual key映射表,INPUTLANGS子目錄下是virtual key到unicode映射表。具體做時(shí)主要是改這兩張表,加上其他一些輔助代碼編譯成DLL。除此之外,WinCE還提供一個(gè)工具 (D:\\WINCE500\\PUBLIC\\COMMON\\OAK\\BIN\\I386\\kbdgen.exe),可以從Windows XP系統(tǒng)鍵盤驅(qū)動(dòng)中提取映射表。比如下面命令生成法語(yǔ)鍵盤映射表的源代碼: kbdgen.exe kbdfr.dll -o kbd_040c -i 0000040C 結(jié)果輸出三個(gè)文件: kbd_040c.reg:注冊(cè)表文件 鍵盤驅(qū)動(dòng)名在注冊(cè)表里[HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Keyboard Layouts]可以查到,比如法語(yǔ)的locale是040C,在0000040c子鍵下可以找到驅(qū)動(dòng)為kbdfr.dll。 scan code到virtual key(即device layout)在ScanCodeToVKeyTable數(shù)組里定義,一般不用改: #define ScanCodeTableFirst 0x00 }; 定制的重點(diǎn)是修改virtual key到unicode映射表,即 aVkToWch1~aVkToWch5等幾個(gè)數(shù)組,歐洲語(yǔ)言鍵盤還要改aDeadKey數(shù)組,這幾個(gè)數(shù)組控制各種組合按鍵輸出,比如用戶按下A, Shift+A, Ctrl+Shift+A, Dead key+A,分別輸出什么東西 。 舉例來(lái)說(shuō),標(biāo)準(zhǔn)美語(yǔ)鍵盤SHIFT+2輸出@,你想改成歐元符號(hào)。先查出的unicode值為20AC(利用MS Office的symbol對(duì)話框),然后修改aVkToWch2數(shù)組: static VK_TO_WCHARS2 aVkToWch2[] = { }; static VK_TO_WCHARS5 aVkToWch5[] = { }; 映射表的修改過(guò)程大致如此。有了DLL還要在注冊(cè)表中做些配置。在platform.reg中添加: [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Layouts\\0000040C] 如果你同時(shí)支持英語(yǔ)和法語(yǔ)鍵盤,可以把法語(yǔ)設(shè)為第二鍵盤: 甚至還可以設(shè)置熱鍵在運(yùn)行時(shí)切換鍵盤: |