【问题标题】:Getting key name from keycode (X11 XGrabKey)从键码获取键名(X11 XGrabKey)
【发布时间】:2018-03-26 12:51:02
【问题描述】:

我在 linux 中有一个全局键事件处理程序,如下所示。我需要知道哪个键盘被抓住了。例如,如果按下键“P”,我会得到相应的键码。有没有办法从这个未签名的密钥代码中获取密钥名称(“P”)?

#include <xcb/xcb.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

#include <QtX11Extras/QX11Info>

void EventFilter::setup(QWidget *target)
{
    this->target = target;

    Display * display = QX11Info::display();
    unsigned int modifiers = ControlMask;
    keycode = XKeysymToKeycode(display, XK_A);
    XGrabKey(display, keycode, modifiers, DefaultRootWindow(display), 1, GrabModeAsync, GrabModeAsync);
}

bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *)
{
    if (eventType == "xcb_generic_event_t")
    {
        xcb_generic_event_t* xcbevent = static_cast<xcb_generic_event_t *>(message);

        switch(xcbevent->response_type)
        {
        case XCB_KEY_PRESS:
            xcb_key_press_event_t * keypress_event = static_cast<xcb_key_press_event_t *>(message);
            if(keypress_event->state & XCB_MOD_MASK_CONTROL)
            {
                if(keypress_event->detail == keycode)
                {
                    //print key name here
                }
            }
        }
    }
   return false;
 } 

【问题讨论】:

标签: c++ qt x11


【解决方案1】:

给定一个键码,从事件detail 字段中,您可以使用XkbKeycodeToKeysym 函数获取KeySym,然后是按下键的文本表示,将KeySym 传递给XKeysymToString 函数.

有这个额外的包括:

#include <X11/XKBlib.h>

然后,在事件处理程序中:

case XCB_KEY_PRESS:
    xcb_key_press_event_t * keypress_event = static_cast<xcb_key_press_event_t *>(message);           
    xcb_keycode_t code = keypress_event->detail;
    qDebug() << XKeysymToString( XkbKeycodeToKeysym(QX11Info::display(), code, 0, 0) );

在上面的示例中,0 的索引作为XkbKeycodeToKeysym 的最后一个参数传递。这将返回按下键的符号,就好像没有按下 shift 键(或 caps lock 或任何其他修饰键)一样。传递 1 的索引将返回符号,就像按下 shift 键一样。其他值(即2)将产生一个符号,即按下更多修饰键(例如,在我的意大利键盘中,我必须按 Alt Gr 才能键入方括号)。

请注意,返回的字符串实际上是一个用于识别键盘符号的名称,例如,abcX 表示字母,但commabackslash 用于其他符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多