【问题标题】:how do I convert XLib keycode to microsoft virtual key?如何将 XLib 键码转换为微软虚拟键?
【发布时间】:2013-02-20 17:40:44
【问题描述】:

如何将 X11 键码转换为 microsoft virtual key code

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

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

【问题讨论】:

  • 为什么要使用 MS 虚拟键码而不是 X 键符?
  • 这是一个多平台项目。我将收到来自 X 的键符。我需要将它们转换为 MS 虚拟键码,以便在另一个系统中进行处理。
  • 可能你能做的最好的就是将 X 键码转换为 X 键符,然后自己映射它们。

标签: windows x11 xlib


【解决方案1】:

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

/* 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2018-09-20
    • 2010-10-07
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多