KeyTranslator.cpp
#include "KeyTranslator.hpp"
#include "windows.h"
#define SupportedModifiersMask 0x1E000000
#define QtAllModifiersMask 0x7E000000
#define QtKeysMask 0x01FFFFFF
KeyTranslator::KeyTranslator()
{
}
bool KeyTranslator::isRegisterable(int key)
{
if ((key & QtAllModifiersMask) != 0) {
return false;
}
key &= QtKeysMask;
for (int i = 0; TranslationTable[i][0] != Qt::Key_unknown; i++) {
if (TranslationTable[i][0] == key) {
return true;
}
}
return false;
}
void KeyTranslator::translateKey(int key, unsigned int* modifiers, unsigned int* virtualKey)
{
unsigned qtModifiers = key &SupportedModifiersMask;
*modifiers = 0x4000;
if (qtModifiers & Qt::ShiftModifier) {
*modifiers |= MOD_SHIFT;
}
if (qtModifiers & Qt::ControlModifier) {
*modifiers |= MOD_CONTROL;
}
if (qtModifiers & Qt::AltModifier) {
*modifiers |= MOD_ALT;
}
if (qtModifiers & Qt::MetaModifier) {
*modifiers |= MOD_WIN;
}
int qtKey = key & QtKeysMask;
*virtualKey = Qt::Key_unknown;
for (int i = 0; TranslationTable[i][0] != Qt::Key_unknown; i++) {
if (qtKey == TranslationTable[i][0]) {
*virtualKey = TranslationTable[i][1];
break;
}
}
}
int KeyTranslator::TranslationTable[][2] =
{
0x01000000, VK_ESCAPE,
0x01000001, VK_TAB,
0x01000003, VK_BACK,
0x01000004, VK_RETURN,
0x01000005, VK_RETURN,
0x01000006, VK_INSERT,
0x01000007, VK_DELETE,
0x01000008, VK_PAUSE,
0x01000009, VK_PRINT,
0x0100000a, VK_SNAPSHOT,
0x0100000b, VK_CLEAR,
0x01000010, VK_HOME,
0x01000011, VK_END,
0x01000012, VK_LEFT,
0x01000013, VK_UP,
0x01000014, VK_RIGHT,
0x01000015, VK_DOWN,
0x01000016, VK_PRIOR,
0x01000017, VK_NEXT,
0x01000024, VK_CAPITAL,
0x01000025, VK_NUMLOCK,
0x01000026, VK_SCROLL,
0x01000030, VK_F1,
0x01000031, VK_F2,
0x01000032, VK_F3,
0x01000033, VK_F4,
0x01000034, VK_F5,
0x01000035, VK_F6,
0x01000036, VK_F7,
0x01000037, VK_F8,
0x01000038, VK_F9,
0x01000039, VK_F10,
0x0100003a, VK_F11,
0x0100003b, VK_F12,
0x0100003c, VK_F13,
0x0100003d, VK_F14,
0x0100003e, VK_F15,
0x0100003f, VK_F16,
0x01000040, VK_F17,
0x01000041, VK_F18,
0x01000042, VK_F19,
0x01000043, VK_F20,
0x01000044, VK_F21,
0x01000045, VK_F22,
0x01000046, VK_F23,
0x01000047, VK_F24,
0x01000055, VK_RMENU,
0x01000058, VK_HELP,
0x20 , VK_SPACE,
0x30 , 0x30,
0x31 , 0x31,
0x32 , 0x32,
0x33 , 0x33,
0x34 , 0x34,
0x35 , 0x35,
0x36 , 0x36,
0x37 , 0x37,
0x38 , 0x38,
0x39 , 0x39,
0x41 , 0x41,
0x42 , 0x42,
0x43 , 0x43,
0x44 , 0x44,
0x45 , 0x45,
0x46 , 0x46,
0x47 , 0x47,
0x48 , 0x48,
0x49 , 0x49,
0x4a , 0x4A,
0x4b , 0x4B,
0x4c , 0x4C,
0x4d , 0x4D,
0x4e , 0x4E,
0x4f , 0x4F,
0x50 , 0x50,
0x51 , 0x51,
0x52 , 0x52,
0x53 , 0x53,
0x54 , 0x54,
0x55 , 0x55,
0x5a , 0x5A,
0x56 , 0x56,
0x57 , 0x57,
0x58 , 0x58,
0x59 , 0x59,
Qt::Key_unknown, 0x00
};
Le problème des "keys" fournies par Qt, c'est qu'elles sont déjà transformées en fonction du clavier physique etc, et c'est donc très dut de récupérer le virtual code natif. La flemme de faire la reverse translation de toutes les touches, et je ne suis même pas sûr d'y arriver