Pergunta

I'd like to be able to load custom key binds for my application. A configuration file would typically contain a list of keys and associated function names.

When I load this file, is there a way to iterate over all the possible virtual keys that would be listed inside the configuration file in the form:

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

Or do I need to manually check for every one of them ?

Foi útil?

Solução

This is the way I finally proceeded to create a map of the keyboard keys. It covers almost all possibilities: non-mappable keys are stored as a hex string, mappable keys which do not represent themselves as a single caracter need to be added manually. Maybe this can be usefull for someone in the future.

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";
}

Outras dicas

In your routine that loads the contents of the file, you'll want to store the data in a map with the keycodes as the keys and function names as the values. Instead of iterating over all possible keycodes, then, just iterate over the entries in the map.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top