2011-11-08 60 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

這是我最終開始創建鍵盤按鍵映射的方式。它涵蓋了幾乎所有的可能性:不可映射的鍵被存儲爲十六進制字符串,可映射的鍵不表示自己爲單個字符需要手動添加。也許這對未來的某個人可能是有用的。

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