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