I basically just assume ALL of them. I don't assume region(except in the descriptions of what key is what keycode), rather I just loop through all of them basically. The following is my current code for putting the description strings into an array. You can see what numbers match up to what keys there. Notice at the beginning I also set all of them to "unknown" first, that way if it detects a keycode that isn't part of it, it will still be usable and just won't have a description for it. You will want to change it to whatever array name you want of course.
Code:
__fhInputDescriptionKeys[255] = 0;
for(var i = 0; i < 256; i++)
{
__fhInputDescriptionKeys[i] = "Unknown";
}
__fhInputDescriptionKeys[vk_escape] = "Escape";
__fhInputDescriptionKeys[vk_f1] = "F1";
__fhInputDescriptionKeys[vk_f2] = "F2";
__fhInputDescriptionKeys[vk_f3] = "F3";
__fhInputDescriptionKeys[vk_f4] = "F4";
__fhInputDescriptionKeys[vk_f5] = "F5";
__fhInputDescriptionKeys[vk_f6] = "F6";
__fhInputDescriptionKeys[vk_f7] = "F7";
__fhInputDescriptionKeys[vk_f8] = "F8";
__fhInputDescriptionKeys[vk_f9] = "F9";
__fhInputDescriptionKeys[vk_f10] = "F10";
__fhInputDescriptionKeys[vk_f11] = "F11";
__fhInputDescriptionKeys[vk_f12] = "F12";
__fhInputDescriptionKeys[145] = "Scroll Lock";
__fhInputDescriptionKeys[vk_pause] = "Pause";
__fhInputDescriptionKeys[192] = "Tilde(~)";
__fhInputDescriptionKeys[vk_tab] = "Tab";
__fhInputDescriptionKeys[49] = "1";
__fhInputDescriptionKeys[50] = "2";
__fhInputDescriptionKeys[51] = "3";
__fhInputDescriptionKeys[52] = "4";
__fhInputDescriptionKeys[53] = "5";
__fhInputDescriptionKeys[54] = "6";
__fhInputDescriptionKeys[55] = "7";
__fhInputDescriptionKeys[56] = "8";
__fhInputDescriptionKeys[57] = "9";
__fhInputDescriptionKeys[48] = "0";
__fhInputDescriptionKeys[189] = "Dash(-)";
__fhInputDescriptionKeys[187] = "Equals(=)";
__fhInputDescriptionKeys[vk_backspace] = "Backspace";
__fhInputDescriptionKeys[65] = "A";
__fhInputDescriptionKeys[66] = "B";
__fhInputDescriptionKeys[67] = "C";
__fhInputDescriptionKeys[68] = "D";
__fhInputDescriptionKeys[69] = "E";
__fhInputDescriptionKeys[70] = "F";
__fhInputDescriptionKeys[71] = "G";
__fhInputDescriptionKeys[72] = "H";
__fhInputDescriptionKeys[73] = "I";
__fhInputDescriptionKeys[74] = "J";
__fhInputDescriptionKeys[75] = "K";
__fhInputDescriptionKeys[76] = "L";
__fhInputDescriptionKeys[77] = "M";
__fhInputDescriptionKeys[78] = "N";
__fhInputDescriptionKeys[79] = "O";
__fhInputDescriptionKeys[80] = "P";
__fhInputDescriptionKeys[81] = "Q";
__fhInputDescriptionKeys[82] = "R";
__fhInputDescriptionKeys[83] = "S";
__fhInputDescriptionKeys[84] = "T";
__fhInputDescriptionKeys[85] = "U";
__fhInputDescriptionKeys[86] = "V";
__fhInputDescriptionKeys[87] = "W";
__fhInputDescriptionKeys[88] = "X";
__fhInputDescriptionKeys[89] = "Y";
__fhInputDescriptionKeys[90] = "Z";
__fhInputDescriptionKeys[219] = "Left Bracket([)";
__fhInputDescriptionKeys[221] = "Right Bracket(])";
__fhInputDescriptionKeys[220] = "Backslash(\\)";
__fhInputDescriptionKeys[20] = "Caps Lock";
__fhInputDescriptionKeys[186] = "Semi-Colon(;)";
__fhInputDescriptionKeys[222] = "Apostrophe(')";
__fhInputDescriptionKeys[13] = "Enter";
__fhInputDescriptionKeys[160] = "Left Shift";
__fhInputDescriptionKeys[161] = "Right Shift";
__fhInputDescriptionKeys[162] = "Left Control";
__fhInputDescriptionKeys[163] = "Right Control";
__fhInputDescriptionKeys[164] = "Left Alt";
__fhInputDescriptionKeys[165] = "Right Alt";
__fhInputDescriptionKeys[188] = "Comma(,)";
__fhInputDescriptionKeys[190] = "Period(.)";
__fhInputDescriptionKeys[191] = "Slash(/)";
__fhInputDescriptionKeys[vk_space] = "Space Bar";
__fhInputDescriptionKeys[93] = "Apps";
__fhInputDescriptionKeys[vk_insert] = "Insert";
__fhInputDescriptionKeys[vk_home] = "Home";
__fhInputDescriptionKeys[vk_pageup] = "Page Up";
__fhInputDescriptionKeys[vk_delete] = "Delete";
__fhInputDescriptionKeys[vk_end] = "End";
__fhInputDescriptionKeys[vk_pagedown] = "Page Down";
__fhInputDescriptionKeys[144] = "Number Lock";
__fhInputDescriptionKeys[111] = "Numpad Slash(/)";
__fhInputDescriptionKeys[106] = "Numpad Asterisk(*)";
__fhInputDescriptionKeys[109] = "Numpad Dash(-)";
__fhInputDescriptionKeys[vk_numpad0] = "Numpad 0";
__fhInputDescriptionKeys[vk_numpad1] = "Numpad 1";
__fhInputDescriptionKeys[vk_numpad2] = "Numpad 2";
__fhInputDescriptionKeys[vk_numpad3] = "Numpad 3";
__fhInputDescriptionKeys[vk_numpad4] = "Numpad 4";
__fhInputDescriptionKeys[vk_numpad5] = "Numpad 5";
__fhInputDescriptionKeys[vk_numpad6] = "Numpad 6";
__fhInputDescriptionKeys[vk_numpad7] = "Numpad 7";
__fhInputDescriptionKeys[vk_numpad8] = "Numpad 8";
__fhInputDescriptionKeys[vk_numpad9] = "Numpad 9";
__fhInputDescriptionKeys[110] = "Numpad Period(.)";
__fhInputDescriptionKeys[107] = "Numpad Plus(+)";
__fhInputDescriptionKeys[vk_left] = "Left Arrow";
__fhInputDescriptionKeys[vk_right] = "Right Arrow";
__fhInputDescriptionKeys[vk_up] = "Up Arrow";
__fhInputDescriptionKeys[vk_down] = "Down Arrow";
One thing I've learned with GMS...for some reason, some of the mouse buttons were showing up as keyboard keys, with low numbered keycodes...I never figured out why. So, what I do is check the mouse first, so if there is an input there, it registers as the mouse. Then, I check the keyboard keys.
The below function is what I'm calling to search the whole keyboard. I'll post the __fhInputCheckKeyboard() function below that as well, but first this one. You will see it checking a few keys first, before going through all 256 codes in a loop. This is because if I'm on Windows, I'm using keyboard_check_direct(), which lets me separate left and right shift properly. It doesn't work on other platforms though, so I'm using the regular keyboard_check() function there.
Code:
function __fhInputSearchKeyboard()
{
if(__fhInputCheckKeyboard(vk_lshift) == 1)
{
return vk_lshift;
}
if(__fhInputCheckKeyboard(vk_rshift) == 1)
{
return vk_rshift;
}
if(__fhInputCheckKeyboard(vk_lcontrol) == 1)
{
return vk_lcontrol;
}
if(__fhInputCheckKeyboard(vk_rcontrol) == 1)
{
return vk_rcontrol;
}
if(__fhInputCheckKeyboard(vk_lalt) == 1)
{
return vk_lalt;
}
if(__fhInputCheckKeyboard(vk_ralt) == 1)
{
return vk_ralt;
}
for(var i = 0; i < 256; i++)
{
if(__fhInputCheckKeyboard(i) == 1)
{
return i;
}
}
return -1;
}
The following code is where it actually checks the keys, the __fhInputCheckKeyboard() function.
Code:
if(os_type == os_windows)
{
if(keyboard_check_direct(keycode))
return 1;
else
return 0;
}
else
{
if(keyboard_check(keycode))
return 1;
else
return 0;
}
So basically, I'm not assuming anything about any of the keys. Besides checking the mouse first(so I don't get false keyboard readings due to GMS's funky stuff), and checking the left/right keys first in case so they get picked up before the generic keycode for shift, I'm just looping through every single possible keycode and if it gets detected, it them saves that into the configuration, and is what gets checked for that action. And even if the description string isn't there, it still has "unknown" for it, and it will still work perfectly.