从键码获取键名称(X11 XGrabKey)

2024-01-04

我在 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;
 } 

给定一个来自事件的关键代码detail字段,你可以得到KeySym使用XkbKeycodeToKeysym函数,然后是按下的键的文本表示,传递KeySym to the 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 键(或大写锁定键,或任何其他修饰键)一样。传递一个索引1将返回符号,就像按下 Shift 键一样。其他值(即2)将产生按更多修饰键获得的符号(例如,在我的意大利语键盘中,我必须按Alt Gr键入方括号)。

请注意,返回的字符串实际上是一个name识别键盘符号,例如,a, b, c or X对于字母,但是comma, or backslash对于其他符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从键码获取键名称(X11 XGrabKey) 的相关文章

随机推荐

  • rsync git 大存储库

    我正在尝试将 git 存储库克隆到我的本地计算机上 但它说 malloc failed 因为存储库太大了 有谁知道我可以用来复制目录的确切 rsync 命令 或者我还能做些什么来克隆一个大存储库 我尝试了 rsync 但出现以下错误 Inv
  • Google 云构建不替换 firebase 令牌的环境变量

    我有一个云构建触发器 尝试将我的应用程序推送到 firebase 托管 为此 我有一个加密的 env enc 文件 其中包含部署所需的 firebase 令牌 在构建过程中 我解密了该文件并尝试部署 但遇到了未经授权的消息 我尝试在部署脚本
  • Composer 自动加载文件夹中的多个文件

    我在最新的项目中使用作曲家并像这样映射我的函数 require require dev autoload psr 4 files src function test function php 我想文件夹函数中会有很多文件 例如 real f
  • UNIX系统中如何连接两个文件的列

    我有2个文件 每个文件有一列多行 每个文件的行是相同的 如何将两个文件的列连接在一起 以便最终结果文件具有来自 file1 和 file2 的两列 例如 文件1是 1 2 3 文件2是 a b c 预期输出是 1 a 2 b 3 c 只需使
  • 如何拖动旋转的 DragShadow?

    我用 ObjectAnimator 旋转了 TextView 如下所示 ObjectAnimator rotate ObjectAnimator ofFloat aRotatedTextView rotation 0f someAngle
  • 如何在Webfaction上部署Flask应用程序?

    有人知道如何在 Webfaction 上部署一个简单的 Flask 应用程序吗 我知道 Webfaction 支持 mod wsgi 并且我阅读了 Flask 网站上的指南 但我仍然无法使我的应用程序运行 有人有工作配置吗 UPDATE回答
  • SourceForge 的下载页面如何运作?

    在回答其他问题时 有人指出 SourceForge 的下载页面是通过添加隐藏的 来工作的 现在似乎不再是这样了 当前版本的下载页面是如何实现的 我想构建类似的东西 因为我认为 SF 的解决方案非常优雅 好吧 更准确地说 确实 最初的 问题
  • Jasmine js:添加测试执行的源方法

    我有一个简单的 hello world 项目 我想测试著名的 h lloWorld 函数 该项目的结构如下 package json spec helloWorldSpec js support jasmine json src hello
  • 确定 sklearn 中 SVM 分类器最有贡献的特征

    我有一个数据集 我想根据该数据训练我的模型 训练后 我需要了解对 SVM 分类器的分类有主要贡献的特征 森林算法有一种叫做特征重要性的东西 有类似的东西吗 是的 有属性coef 对于 SVM 分类器 但它仅适用于 SVM线性核 对于其他内核
  • 如何在后台线程上执行 WPF 过滤器?

    我在 WPF 中使用过滤器并且遵循建议的模式here http www japf fr 2009 02 very simple mvvm demo application 总而言之 这涉及在 ViewModel 上公开一个文本属性 该属性表
  • 使用 OsmBonusPack 解析和查看 geojson

    我想解析 geojson 并查看 osmbonuspack 和 osmdroid mapview 上的数据 我用了这个教程 https code google com p osmbonuspack wiki Tutorial 4 https
  • 使用 jQuery 验证 RECAPTCHA

    我正在尝试使用 jQuery 验证 Recaptcha 但我不断收到错误消息 访问受限 URI 被拒绝 代码 1012 这是我到目前为止所尝试过的 var challengeVal recaptcha challenge field att
  • 如何在 GitHub Actions 中区分不同事件类型的条件

    我们有一个工作流程文件 name Deploy Test Env on pull request types edited opened synchronize branches develop paths js jobs deploy y
  • AVSpeechSynthesizer 输出为文件?

    AVSpeechSynthesizer 有一个相当简单的 API 不支持保存到内置音频文件 我想知道是否有办法解决这个问题 也许在无声播放时记录输出 以便稍后播放 或者更有效的东西 这在 iOS 13 中终于成为可能AVSpeechSynt
  • 有没有命令可以向群组的所有成员发送私人消息?

    有没有办法让命令使用discord js向discord组的所有成员发送私人消息 示例 private TEST 此消息通过私人聊天而不是频道聊天发送给群组中的每个人 您可以迭代Guild members https discord js
  • Rails 迁移:t.references 具有替代名称?

    所以我有一个像这样的学校课程的 create table create table courses do t t string name t references course t timestamps end 但我想要它参考two其他课程
  • 最好是 Mavenize 项目 jar 文件还是将它们放在 WEB-INF/lib 中?

    我一直在为 Spring MVC 项目所需的所有 jar 文件执行此操作 call mvn install install file DgroupId vegetables DartifactId potatoes Dversion 1 0
  • 如果从文件读取,秒差距失败且没有错误

    我编写了一个小型秒差距解析器来从用户提供的输入字符串或输入文件中读取样本 如果输入以分号分隔的字符串形式提供 则它会在错误输入时正确失败 并显示有用的错误消息 gt readUncalC14String test1 7444 37 6800
  • 无法创建新项目并升级到React Native版本最新0.69.1

    我们无法使用 React Native 最新版本 0 69 1 创建新项目 我用旧版本创建了新项目 然后我升级到0 69 1 npx 反应本机升级 但我无法完全升级 当我跑步时npm i命令 错误来了 npm ERR ERESOLVE co
  • 从键码获取键名称(X11 XGrabKey)

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