2013-02-20 61 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