1

Windows KBD ファイルを読み取ってキーボードを構築する仮想キーボード アプリケーションを作成しています。仮想キーごとに返される文字の配列を解釈する方法がわかりません。

この CodePlex プロジェクトで 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 キーボードで結果を分析する場合、この構造体とそれに含まれるデータは理にかなっています。

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

これは、各仮想キー (別の kbd.h 構造体) に対して返される文字の配列について、最初のものは修飾子を表しておらず、2 番目のもの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 の配列は、各仮想キーの文字の各インデックスと、それらが表す修飾キーを記述していると思いました。この仮定は、米国のキーボード レイアウトでは正しく機能しましたが、ドイツ語のキーボード レイアウトではそうではありませんでした。

4

2 に答える 2

1

KbdEditのメーカーに意見を求めるメールを送信したところ、回答が返ってきました。

ModNumber 配列内の 0 から始まる位置は、修飾子の組み合わせを定義します。たとえば、最後の要素「2」は位置 6 にあり、そのバイナリ表現は 110 です。KBDALT、つまり AltGr (www.kbdedit.com/manual/low_level_modifiers.html#AltGr) 値「2」は、AltGr マッピングがすべての aVkToWchX[] 配列 (X>=3 の場合) のインデックス 2 に表示されることを意味します。

位置 3 は Shift+Ctrl (= 011 = KBDSHIFT | KBDCTRL) に対応します。この組み合わせは aVkToWchX[4] (X>=5 の場合) にあることがわかります。

KbdEdit でドイツ語のレイアウトを開くと、実際に AltGr が位置 2 にあり、Shift+Ctrl が位置 4 (ゼロベース) にあることがわかります - 添付のスクリーンショットを参照してください。

お役に立てれば。

よろしく、イビカ

ありがとうイヴィカ!

于 2014-03-10T04:49:58.280 に答える