2013-02-20 66 views
2

怎样的X11键码转换为microsoft virtual key code如何将XLib键码转换为Microsoft虚拟键值?

int processKeyboardMessage(XEvent *event) 
{ 
    assert(KeyPress == event->type); 

    //TODO: Before returning convert keycode into microsoft virtual key code  
    return (event->xkey.keycode); 
} 
+0

为什么要使用MS虚拟键码而不是X keysyms? – parkydr 2013-02-20 20:56:30

+0

这是一个多平台项目。我将从X接收密钥。我需要将它们转换为MS虚拟密钥才能在另一个系统中处理。 – JonnyRo 2013-02-21 05:03:37

+0

可能最好的做法是将X键码转换为X键盘,然后自己映射它们。 – parkydr 2013-02-21 08:18:11

回答

1

一种选择是让枚举所有每个平台上的可能的密钥。然后,您可以使用系统本机格式处理应用程序中的键码。你需要做一些微妙的事情来解决某些情况(如win32上的左/右ALT),但是你可以实现这些特殊情况并更新你的枚举。而不是在每个平台上创建大型表格或开关盒语句。

/* my_key.h : creates names for key codes on Windows and X11 */ 
#ifndef MY_KEY_H 
#define MY_KEY_H 
#if defined(_WIN32) 
#include <windows.h> 
enum my_key { 
    MY_KEY_BACKSPACE = VK_BACK, 
    MY_KEY_RETURN = VK_RETURN, 
    MY_KEY_LEFT = VK_LEFT, 
    MY_KEY_RIGHT = VK_RIGHT, 
    MY_KEY_DOWN = VK_DOWN, 
    MY_KEY_UP = VK_UP, 
    /* TODO: define the rest of the keys */ 
}; 
#else defined(__APPLE__) 
enum my_key { 
    MY_KEY_BACKSPACE = 0x33, 
    MY_KEY_RETURN = 0x24, 
    MY_KEY_LEFT = 0x7b, 
    MY_KEY_RIGHT = 0x7c, 
    MY_KEY_DOWN = 0x7d, 
    MY_KEY_UP = 0x7e, 
    /* TODO: define the rest of the keys */ 
}; 
#else /* assume X11 */ 
#include <X11/keysym.h> 
enum my_key { 
    MY_KEY_BACKSPACE = XK_BackSpace, 
    MY_KEY_RETURN = XK_Linefeed, 
    MY_KEY_LEFT = XK_Left, 
    MY_KEY_RIGHT = XK_Right, 
    MY_KEY_DOWN = XK_Down, 
    MY_KEY_UP = XK_Up, 
    /* TODO: define the rest of the keys */ 
}; 
#endif 
#endif