2011-11-08 4 views
1

私のアプリケーションのカスタムキーバインドをロードできるようにしたいと思います。構成ファイルには、通常、キーと関連する関数名のリストが含まれています。C++キーボードキーをバインドする:すべての仮想キーを繰り返しますか?

for(int i = key0; i < keymax; i = i+key){ 
    char key = itoa(i); 
    if(cfgfile.getfunction(key,function)){ 
     _keyBinds[key] = function; 
    } 
} 

するか、私は手動ですべてのためにチェックする必要があります:私は、このファイルをロードすると

、フォーム構成ファイル内にリストされてしまう可能なすべての仮想キーを反復する方法がありますそれらの中の一つ ?

答えて

1

これは私が最終的にキーボードのキーのマップを作成する方法です。ほぼすべての可能性をカバーします。マッピング不可能なキーは16進数の文字列として格納され、手動で追加する必要があるマッピング可能なキーは1つの文字として表されません。たぶんこれは将来の誰かにとって役に立ちます。

CreateKeyboardMap() 
{ 
    string keystring; 
    char keybuffer; 
    for(int i = 0; i < 256; ++i){ 
     if(keybuffer = MapVirtualKey(UINT(i),2)){ 
      keystring += keybuffer; 
     } 
     else{ 
      keystring = int_to_hex(i); 
     } 
     _keyboardMap.insert(_keyboardMap.end(),pair<UINT,string>(i,keystring)); 
     keystring = ""; 
    } 

    _keyboardMap[0x1B] = "ESCAPE"; 
    _keyboardMap[0x70] = "F1"; 
    _keyboardMap[0x71] = "F2"; 
    _keyboardMap[0x72] = "F3"; 
    _keyboardMap[0x73] = "F4"; 
    _keyboardMap[0x74] = "F5"; 
    _keyboardMap[0x75] = "F6"; 
    _keyboardMap[0x76] = "F7"; 
    _keyboardMap[0x77] = "F8"; 
    _keyboardMap[0x78] = "F9"; 
    _keyboardMap[0x79] = "F10"; 
    _keyboardMap[0x7A] = "F11"; 
    _keyboardMap[0x7B] = "F12"; 
    _keyboardMap[0x2C] = "PRINT SCREEN"; 
    _keyboardMap[0x91] = "SCROLL LOCK"; 
    _keyboardMap[0x08] = "BACKSPACE"; 
    _keyboardMap[0x20] = "SPACE"; 
    _keyboardMap[0x2D] = "INSERT"; 
    _keyboardMap[0x24] = "HOME"; 
    _keyboardMap[0x22] = "PAGE DOWN"; 
    _keyboardMap[0x21] = "PAGE UP"; 
    _keyboardMap[0x2E] = "DELETE"; 
    _keyboardMap[0x90] = "NUMLOCK"; 
    _keyboardMap[0x6F] = "NUMPAD /"; 
    _keyboardMap[0x6A] = "NUMPAD *"; 
    _keyboardMap[0x6D] = "NUMPAD -"; 
    _keyboardMap[0x6B] = "NUMPAD +"; 
    _keyboardMap[0x6E] = "NUMPAD ."; 
    _keyboardMap[0x60] = "NUMPAD 0"; 
    _keyboardMap[0x61] = "NUMPAD 1"; 
    _keyboardMap[0x62] = "NUMPAD 2"; 
    _keyboardMap[0x63] = "NUMPAD 3"; 
    _keyboardMap[0x64] = "NUMPAD 4"; 
    _keyboardMap[0x65] = "NUMPAD 5"; 
    _keyboardMap[0x66] = "NUMPAD 6"; 
    _keyboardMap[0x67] = "NUMPAD 7"; 
    _keyboardMap[0x68] = "NUMPAD 8"; 
    _keyboardMap[0x68] = "NUMPAD 9"; 

    _keyboardMap[0x26] = "ARROW UP"; 
    _keyboardMap[0x28] = "ARROW DOWN"; 
    _keyboardMap[0x25] = "ARROW LEFT"; 
    _keyboardMap[0x27] = "ARROW RIGHT"; 

    _keyboardMap[0x0D] = "ENTER"; 
    _keyboardMap[0xA0] = "LSHIFT"; 
    _keyboardMap[0xA1] = "RSHIFT"; 
    _keyboardMap[0x09] = "TAB"; 
    _keyboardMap[0x14] = "CAPS LOCK"; 
    _keyboardMap[0xA2] = "LCONTROL"; 
    _keyboardMap[0xA3] = "RCONTROL"; 
    _keyboardMap[0xA4] = "LALT"; 
    _keyboardMap[0xA5] = "RALT"; 
    _keyboardMap[0x5B] = "LWIN"; 
    _keyboardMap[0x5C] = "RWIN"; 
} 
0

ファイルの内容をロードするルーチンでは、キーコードと関数名を値として、mapにデータを格納することをお勧めします。可能なすべてのキーコードを反復処理する代わりに、マップ内のエントリを繰り返し処理します。

+0

はい、しかし、質問可能なすべてのキーを反復処理する方法で、すべての仮想キーが進値を持っており、あなたが実際に表示されているのでマップが指定したキーだけ – Smash

+0

のエントリで、その時点で作成されます上記のようにしてforループを実行すると、実際の問題ではないことは明らかです。 –

+0

forループは問題を説明するためのものでした。したがって、すべての可能な仮想キーを繰り返し処理する方法_と最後に_ _また、手動ですべてをチェックする必要がありますか?_ – Smash

関連する問題