2014-03-03 35 views
0

我正在寫一個虛擬鍵盤應用程序,它讀取Windows KBD文件來構建鍵盤。我無法理解如何解釋爲每個虛擬鍵返回的字符數組。讀取鍵盤KBD.dll文件並理解修飾符狀態

我使用的是this CodePlex project中的kbd.h文件。

這是我不理解的結構。

typedef struct { 
    PVK_TO_BIT pVkToBit;  // Virtual Keys -> Mod bits 
    WORD  wMaxModBits; // max Modification bit combination value 
    BYTE  ModNumber[]; // Mod bits -> Modification Number 
} MODIFIERS, *KBD_LONG_POINTER PMODIFIERS; 

閱讀文檔並使用美式鍵盤分析結果時,此結構及其包含的數據是有意義的。

--------------- 
US 
--------------- 
CharModifiers 
0001 = SHIFT 
0010 = CTRL 
0100 = ALT 
ModNumber 
0000 = 0  = BASE 
0001 = 1  = SHIFT 
0010 = 2  = CTRL 
0011 = 3  = SHIFT + CTRL 

什麼這說的是,對於字符數組返回每個虛擬鍵(另一kbd.h結構),第一個表示無改性劑,第二個代表值時SHIFT被保持,等等。這是準確的,並且完美地映射到爲每個虛擬鍵返回的字符數組。

但是,如果我加載德語鍵盤佈局(KBDGR.dll),則PMODIFIERS不會與爲每個虛擬鍵返回的字符數組對齊。

--------------- 
German 
--------------- 
CharModifiers 
0001 = SHIFT 
0010 = CTRL 
0100 = ALT 
ModNumber 
0000 = 0  = BASE   = REALLY BASE 
0001 = 1  = SHIFT   = REALLY SHIFT 
0011 = 3  = SHIFT + CTRL = REALLY ALTGR 
0100 = 4  = ALT   = REALLY CTRL 
1111 = 15 = INVALID  = INVALID 
1111 = 15 = INVALID  = INVALID 
0010 = 2  = CTRL   = REALLY SHIFT + CTRL 
0101 = 5  = SHIFT + ALT = REALLY SHIFT + ALTGR 

正如你可以在這裏看到,例如0010應該只是一個CTRL修改相關,但是,從人物的虛擬鍵真正代表SHIFT + CTRL返回。

我不理解什麼?我認爲ModNumber數組描述了每個虛擬鍵的每個字符索引以及它們所代表的修飾鍵。這個假設適用於美國鍵盤佈局,但當德國鍵盤佈局不適用時?

回答

1

我發郵件給KbdEdit的製造商供他們參考,他們只是回答了答案!

ModNumber陣列內從零開始位置限定了改性劑 組合:例如,最後一個元素「2」是在第6位,其二進制 表示爲110,即KBDCTRL | KBDALT,即AltGr (www.kbdedit.com/manual/low_level_modifiers.html#AltGr)值「2」 意味着AltGr映射將出現在所有aVkToWchX [] 數組中的索引2處(對於X> = 3)。

位置3對應於SHIFT + CTRL(= 011 = KBDSHIFT | KBDCTRL) - 你看到,這種結合是在 aVkToWchX被發現[4](對於X> = 5)

如果在KbdEdit中打開德文佈局, 您會看到確實AltGr位於位置2,Shift + Ctrl位於 位置4(基於零) - 請參閱附加的截圖。

希望這會有所幫助。

問候, 伊維察

伊維謝謝!

0

我從來沒有想過這個:)在kbd.h文件中的描述也沒有多大意義,所以我沒有理解它。

在kbd.h頭它指出:

 
*      CONTROL MENU SHIFT 
*       ^ ^ ^
* aModification[] = { |  |  | 
*  0,   // 0  0  0  = 000 (none) 

我相信改性劑應該是:
001 = SHIFT
010 = ALT
100 = CTRL

我同意這個清單在德國人看來是不合邏輯的,我轉載了它。

但我主要研究掃描代碼(物理位置)和虛擬鍵之間的聯繫。每個虛擬鍵都包含修飾符,這樣您可以在所有修改器組合之間進行迭代。

由於我的挪威我處理的KBDNO.dll第一,比較它的MKLC:http://msdn.microsoft.com/en-us/goglobal/bb964665.aspx

既然你問了德語鍵盤我也進行了比較,它似乎相匹配。和美國一樣。

檢查出我的網站我的「虛擬鍵盤」:http://lars.werner.no/?page_id=922

的CKLL級可以幫助你很多達到你正在嘗試做的。這門課並不完美,所以你必須花幾個小時才能到達那裏。將鍵盤看作一組基於修飾符的虛擬鍵的掃描代碼:)

對不起,沒有更有用的atm,但它已經有一段時間,因爲我甚至編程。我的業餘愛好很少閒暇時間!

+0

嘿拉爾斯!檢查我的答案!我找到了解決方案! –