首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从密钥代码中获取密钥名(X11 XGrabKey)

从密钥代码中获取密钥名(X11 XGrabKey)
EN

Stack Overflow用户
提问于 2018-03-26 12:51:02
回答 1查看 2.5K关注 0票数 0

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

代码语言:javascript
复制
#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;
 } 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-27 08:58:01

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

这些额外费用包括:

代码语言:javascript
复制
#include <X11/XKBlib.h>

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

代码语言:javascript
复制
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键(或大写锁或任何其他修饰符键)一样。传递1索引将返回符号,就好像按了shift键一样。其他值(即2)将产生一个获得按下更多修饰符键的符号(例如,在我的意大利语键盘中,我必须按Alt键输入方括号)。

请注意,返回的字符串实际上是标识键盘符号的名称,例如,字母可以是abcX,而其他符号则可以是commabackslash

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49491918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档