Key Code Finder

Post those lines of code you feel like sharing or find what you require for your project here; or simply use them as tutorials.
Post Reply
arras
Posts: 1622
Joined: Mon Apr 05, 2004 8:35 am
Location: Slovakia
Contact:

Key Code Finder

Post by arras »

Just press keyboard key to find out its EKEY_CODE representation.
To my surprise, not all keys are represented by enumeration names. ~ / ; ' [ ] are not for example, but they are detected and given index numbers.

Code: Select all

// Key Code Finder for Irrlicht 1.4
// by arras
// 08.02.2008

// press keyboard key to find its EKEY_CODE index and name

#include <irrlicht.h>
using namespace irr;

u32 Index;
gui::IGUIStaticText *Text1;
gui::IGUIStaticText *Text2;

core::stringc KeyCodeName[KEY_KEY_CODES_COUNT];

class EventReceiver : public IEventReceiver
{
public:
   virtual bool OnEvent(const SEvent& event)
   {
      if (event.EventType == EET_KEY_INPUT_EVENT)
      {
         if(event.KeyInput.PressedDown)
         {
            Index = (u32)event.KeyInput.Key;
            core::stringw tmp("ENUMERATION INDEX = ");
            tmp += Index;
            Text1->setText(tmp.c_str());
            
            tmp = "EKEY_CODE = ";
            tmp += KeyCodeName[Index].c_str();
            Text2->setText(tmp.c_str());
            
            return true;
         }
      }
      
      return false;
   }
};

int main()
{
   KeyCodeName[0x01] = "KEY_LBUTTON";
   KeyCodeName[0x02] = "KEY_RBUTTON";
   KeyCodeName[0x03] = "KEY_CANCEL";
   KeyCodeName[0x04] = "KEY_MBUTTON";
   KeyCodeName[0x05] = "KEY_XBUTTON1";
   KeyCodeName[0x06] = "KEY_XBUTTON2";
   KeyCodeName[0x08] = "KEY_BACK";
   KeyCodeName[0x09] = "KEY_TAB";
   KeyCodeName[0x0C] = "KEY_CLEAR";
   KeyCodeName[0x0D] = "KEY_RETURN";
   KeyCodeName[0x10] = "KEY_SHIFT";
   KeyCodeName[0x11] = "KEY_CONTROL";
   KeyCodeName[0x12] = "KEY_MENU";
   KeyCodeName[0x13] = "KEY_PAUSE";
   KeyCodeName[0x14] = "KEY_CAPITAL";
   KeyCodeName[0x15] = "KEY_KANA";
   KeyCodeName[0x15] += " KEY_HANGUEL";
   KeyCodeName[0x15] += " KEY_HANGUL";
   KeyCodeName[0x17] = "KEY_JUNJA";
   KeyCodeName[0x18] = "KEY_FINAL";
   KeyCodeName[0x19] = "KEY_HANJA";
   KeyCodeName[0x19] += " KEY_KANJI";
   KeyCodeName[0x1B] = "KEY_ESCAPE";
   KeyCodeName[0x1C] = "KEY_CONVERT";
   KeyCodeName[0x1D] = "KEY_NONCONVERT";
   KeyCodeName[0x1E] = "KEY_ACCEPT";
   KeyCodeName[0x1F] = "KEY_MODECHANGE";
   KeyCodeName[0x20] = "KEY_SPACE";
   KeyCodeName[0x21] = "KEY_PRIOR";
   KeyCodeName[0x22] = "KEY_NEXT";
   KeyCodeName[0x23] = "KEY_END";
   KeyCodeName[0x24] = "KEY_HOME";
   KeyCodeName[0x25] = "KEY_LEFT";
   KeyCodeName[0x26] = "KEY_UP";
   KeyCodeName[0x27] = "KEY_RIGHT";
   KeyCodeName[0x28] = "KEY_DOWN";
   KeyCodeName[0x29] = "KEY_SELECT";
   KeyCodeName[0x2A] = "KEY_PRINT";
   KeyCodeName[0x2B] = "KEY_EXECUT";
   KeyCodeName[0x2C] = "KEY_SNAPSHOT";
   KeyCodeName[0x2D] = "KEY_INSERT";
   KeyCodeName[0x2E] = "KEY_DELETE";
   KeyCodeName[0x2F] = "KEY_HELP";
   KeyCodeName[0x30] = "KEY_KEY_0";
   KeyCodeName[0x31] = "KEY_KEY_1";
   KeyCodeName[0x32] = "KEY_KEY_2";
   KeyCodeName[0x33] = "KEY_KEY_3";
   KeyCodeName[0x34] = "KEY_KEY_4";
   KeyCodeName[0x35] = "KEY_KEY_5";
   KeyCodeName[0x36] = "KEY_KEY_6";
   KeyCodeName[0x37] = "KEY_KEY_7";
   KeyCodeName[0x38] = "KEY_KEY_8";
   KeyCodeName[0x39] = "KEY_KEY_9";
   KeyCodeName[0x41] = "KEY_KEY_A";
   KeyCodeName[0x42] = "KEY_KEY_B";
   KeyCodeName[0x43] = "KEY_KEY_C";
   KeyCodeName[0x44] = "KEY_KEY_D";
   KeyCodeName[0x45] = "KEY_KEY_E";
   KeyCodeName[0x46] = "KEY_KEY_F";
   KeyCodeName[0x47] = "KEY_KEY_G";
   KeyCodeName[0x48] = "KEY_KEY_H";
   KeyCodeName[0x49] = "KEY_KEY_I";
   KeyCodeName[0x4A] = "KEY_KEY_J";
   KeyCodeName[0x4B] = "KEY_KEY_K";
   KeyCodeName[0x4C] = "KEY_KEY_L";
   KeyCodeName[0x4D] = "KEY_KEY_M";
   KeyCodeName[0x4E] = "KEY_KEY_N";
   KeyCodeName[0x4F] = "KEY_KEY_O";
   KeyCodeName[0x50] = "KEY_KEY_P";
   KeyCodeName[0x51] = "KEY_KEY_Q";
   KeyCodeName[0x52] = "KEY_KEY_R";
   KeyCodeName[0x53] = "KEY_KEY_S";
   KeyCodeName[0x54] = "KEY_KEY_T";
   KeyCodeName[0x55] = "KEY_KEY_U";
   KeyCodeName[0x56] = "KEY_KEY_V";
   KeyCodeName[0x57] = "KEY_KEY_W";
   KeyCodeName[0x58] = "KEY_KEY_X";
   KeyCodeName[0x59] = "KEY_KEY_Y";
   KeyCodeName[0x5A] = "KEY_KEY_Z";
   KeyCodeName[0x5B] = "KEY_LWIN";
   KeyCodeName[0x5C] = "KEY_RWIN";
   KeyCodeName[0x5D] = "KEY_APPS";
   KeyCodeName[0x5F] = "KEY_SLEEP";
   KeyCodeName[0x60] = "KEY_NUMPAD0";
   KeyCodeName[0x61] = "KEY_NUMPAD1";
   KeyCodeName[0x62] = "KEY_NUMPAD2";
   KeyCodeName[0x63] = "KEY_NUMPAD3";
   KeyCodeName[0x64] = "KEY_NUMPAD4";
   KeyCodeName[0x65] = "KEY_NUMPAD5";
   KeyCodeName[0x66] = "KEY_NUMPAD6";
   KeyCodeName[0x67] = "KEY_NUMPAD7";
   KeyCodeName[0x68] = "KEY_NUMPAD8";
   KeyCodeName[0x69] = "KEY_NUMPAD9";
   KeyCodeName[0x6A] = "KEY_MULTIPLY";
   KeyCodeName[0x6B] = "KEY_ADD";
   KeyCodeName[0x6C] = "KEY_SEPARATOR";
   KeyCodeName[0x6D] = "KEY_SUBTRACT";
   KeyCodeName[0x6E] = "KEY_DECIMAL";
   KeyCodeName[0x6F] = "KEY_DIVIDE";
   KeyCodeName[0x70] = "KEY_F1";
   KeyCodeName[0x71] = "KEY_F2";
   KeyCodeName[0x72] = "KEY_F3";
   KeyCodeName[0x73] = "KEY_F4";
   KeyCodeName[0x74] = "KEY_F5";
   KeyCodeName[0x75] = "KEY_F6";
   KeyCodeName[0x76] = "KEY_F7";
   KeyCodeName[0x77] = "KEY_F8";
   KeyCodeName[0x78] = "KEY_F9";
   KeyCodeName[0x79] = "KEY_F10";
   KeyCodeName[0x7A] = "KEY_F11";
   KeyCodeName[0x7B] = "KEY_F12";
   KeyCodeName[0x7C] = "KEY_F13";
   KeyCodeName[0x7D] = "KEY_F14";
   KeyCodeName[0x7E] = "KEY_F15";
   KeyCodeName[0x7F] = "KEY_F16";
   KeyCodeName[0x80] = "KEY_F17";
   KeyCodeName[0x81] = "KEY_F18";
   KeyCodeName[0x82] = "KEY_F19";
   KeyCodeName[0x83] = "KEY_F20";
   KeyCodeName[0x84] = "KEY_F21";
   KeyCodeName[0x85] = "KEY_F22";
   KeyCodeName[0x86] = "KEY_F23";
   KeyCodeName[0x87] = "KEY_F24";
   KeyCodeName[0x90] = "KEY_NUMLOCK";
   KeyCodeName[0x91] = "KEY_SCROLL";
   KeyCodeName[0xA0] = "KEY_LSHIFT";
   KeyCodeName[0xA1] = "KEY_RSHIFT";
   KeyCodeName[0xA2] = "KEY_LCONTROL";
   KeyCodeName[0xA3] = "KEY_RCONTROL";
   KeyCodeName[0xA4] = "KEY_LMENU";
   KeyCodeName[0xA5] = "KEY_RMENU";
   KeyCodeName[0xBB] = "KEY_PLUS";
   KeyCodeName[0xBC] = "KEY_COMMA";
   KeyCodeName[0xBD] = "KEY_MINUS";
   KeyCodeName[0xBE] = "KEY_PERIOD";
   KeyCodeName[0xF6] = "KEY_ATTN";
   KeyCodeName[0xF7] = "KEY_CRSEL";
   KeyCodeName[0xF8] = "KEY_EXSEL";
   KeyCodeName[0xF9] = "KEY_EREOF";
   KeyCodeName[0xFA] = "KEY_PLAY";
   KeyCodeName[0xFB] = "KEY_ZOOM";
   KeyCodeName[0xFD] = "KEY_PA1";
   KeyCodeName[0xFE] = "KEY_OEM_CLEAR";
   
   EventReceiver receiver;
   
   IrrlichtDevice* device = createDevice(
      video::EDT_SOFTWARE,
      core::dimension2d<s32>(320, 240), 32, false, false, false, &receiver);
    
   video::IVideoDriver* driver = device->getVideoDriver();
	gui::IGUIEnvironment* guienv = device->getGUIEnvironment();
	
	device->setWindowCaption(L"KeyCodeFinder for Irrlicht 1.4 by arras 08.02.2008");
	
	guienv->addStaticText(L"PRESS KEY", core::rect<s32>(10,10,200,20));
	
	Text1 = guienv->addStaticText(L"ENUMERATION INDEX = ", core::rect<s32>(10,30,200,40));
	Text2 = guienv->addStaticText(L"EKEY_CODE = ", core::rect<s32>(10,50,200,60));
	
	core::stringw str("KEY_KEY_CODES_COUNT = ");
	str += KEY_KEY_CODES_COUNT;
	guienv->addStaticText(str.c_str(), core::rect<s32>(10,70,200,80));
   
	while(device->run())
   {
      driver->beginScene(true, true, video::SColor(255,200,200,200));
		guienv->drawAll();
		driver->endScene();
   }
   device->drop();

   return 0;
}
Halifax
Posts: 1424
Joined: Sun Apr 29, 2007 10:40 pm
Location: $9D95

Post by Halifax »

Hmm, for some optimizations you might want to take the declarations for KeyCodeName out of the main() functions, and opt for a more appropiate decision of declaring it as 'const'. Otherwise, great code.
TheQuestion = 2B || !2B
arras
Posts: 1622
Joined: Mon Apr 05, 2004 8:35 am
Location: Slovakia
Contact:

Post by arras »

Thanks Halifax.
for some optimizations you might want to take the declarations for KeyCodeName out of the main() functions, and opt for a more appropiate decision of declaring it as 'const'
but how can I do that with core::string object?
MasterGod
Posts: 2061
Joined: Fri May 25, 2007 8:06 pm
Location: Israel
Contact:

Post by MasterGod »

Very useful thanks.
- "Alt" key doesn't working..
Last edited by MasterGod on Sat Feb 09, 2008 5:29 pm, edited 1 time in total.
Image
Dev State: Abandoned (For now..)
Requirements Analysis Doc: ~87%
UML: ~0.5%
arras
Posts: 1622
Joined: Mon Apr 05, 2004 8:35 am
Location: Slovakia
Contact:

Post by arras »

Thanks MasterGod ...nice logo btw :)
"Alt" key doesn't working..
Yes as well as F10: http://irrlicht.sourceforge.net/phpBB2/ ... hp?t=26189
Halifax
Posts: 1424
Joined: Sun Apr 29, 2007 10:40 pm
Location: $9D95

Post by Halifax »

I don't know about stringc, as I don't use it much, but I would try this:

Code: Select all

const core::stringc* KeyCodeNames = { "ONE_NAME", "TWO_NAME", etc... }
but if that doesn't work, then you can always switch over to 'char'

Code: Select all

const char** KeyCodeNames = { "ONE_NAME", "TWO_NAME", etc... }
And all in all optimization isn't exactly important for this project, but it is just a suggestion in the future for your other projects that may need memory optimization, because those values should definitely be read-only and not read-write.
TheQuestion = 2B || !2B
arras
Posts: 1622
Joined: Mon Apr 05, 2004 8:35 am
Location: Slovakia
Contact:

Post by arras »

Thanks Halifax.
Problem is not all "slots" in array are used. This way it was easier and quicker to copy/paste all names/numbers from Keycodes.h without mistakes (hopefully) ...and it took some time :wink:
But I'll keep your advice in mind for future.
Halifax
Posts: 1424
Joined: Sun Apr 29, 2007 10:40 pm
Location: $9D95

Post by Halifax »

Well even if not all slots are used, then you just insert an empty string "" for the empty slot.
TheQuestion = 2B || !2B
arras
Posts: 1622
Joined: Mon Apr 05, 2004 8:35 am
Location: Slovakia
Contact:

Post by arras »

const core::stringc* KeyCodeNames = { "ONE_NAME", "TWO_NAME", etc... }
Thats possible, but without that pointer.
Post Reply