linux 使用Xcb监听键盘鼠标输入
前言在现代Linux桌面开发中高效、低延迟的输入事件处理至关重要。XCB作为X11协议的现代化接口不仅提供更优的性能还通过其无状态、异步的设计为输入监听带来了革命性的改进。本文将深入探讨如何使用XCB实现高性能的全局键盘鼠标输入监听构建响应灵敏的桌面应用。X11输入事件系统架构略基础键鼠事件监听XCB原生事件同样不支持键盘鼠标的全局监听因此同样选择通过额外的扩展来实现监听。2.1 键码解析由于XCB库没有提供完整的键盘映射函数而事件KeyCode和修饰符状态与X11完全一样因此直接使用X11的转换函数即可。高级键鼠事件监听3.1 XInput扩展intmain(){xcb_connection_t*connxcb_connect(NULL,NULL);if(xcb_connection_has_error(conn)){fprintf(stderr,XCB连接失败\n);return-1;}xcb_prefetch_extension_data(conn,xcb_input_id);autorecord_extxcb_get_extension_data(conn,xcb_input_id);if(!record_ext||!record_ext-present){fprintf(stderr,XInput 扩展不可用\n);return-1;}autorootxcb_setup_roots_iterator(xcb_get_setup(conn)).data-root;structxcb_input_event_mask_extend{xcb_input_event_mask_t header;unsignedmask;}event_mask{XCB_INPUT_DEVICE_ALL,1,XCB_INPUT_XI_EVENT_MASK_KEY_PRESS|XCB_INPUT_XI_EVENT_MASK_BUTTON_PRESS};xcb_input_xi_select_events(conn,root,1,(constxcb_input_event_mask_t*)event_mask);xcb_flush(conn);while(1){std::unique_ptrxcb_generic_event_tevent(xcb_wait_for_event(conn));if(event-response_type!XCB_GE_GENERIC){continue;}switch(((xcb_ge_generic_event_t*)event.get())-event_type){caseXCB_KEY_PRESS:{autokey_event(xcb_input_key_press_event_t*)event.get();printf( Mouse Button Press \n);printf( Button: %d\n,key_event-detail);printf( Root Coordinates: (%f, %f)\n,key_event-root_x16,key_event-root_y16);}break;caseXCB_BUTTON_PRESS:{autobtn_event(xcb_input_button_press_event_t*)event.get();printf( Key Press \n);printf( Key: %d\n,btn_event-detail);printf( Mask: %d\n,btn_event-mods.effective);}break;}}xcb_disconnect(conn);return0;}3.2 Record扩展intmain(){xcb_connection_t*connectionxcb_connect(NULL,NULL);if(xcb_connection_has_error(connection)){fprintf(stderr,XCB连接失败\n);return-1;}xcb_prefetch_extension_data(connection,xcb_record_id);constxcb_query_extension_reply_t*record_extxcb_get_extension_data(connection,xcb_record_id);if(!record_ext||!record_ext-present){fprintf(stderr,RECORD 扩展不可用\n);return-1;}xcb_record_client_spec_t clientsXCB_RECORD_CS_ALL_CLIENTS;xcb_record_context_t contextxcb_generate_id(connection);xcb_record_range_t range;memset(range,0,sizeof(range));range.device_events.firstXCB_KEY_PRESS;range.device_events.lastXCB_BUTTON_PRESS;xcb_void_cookie_t create_cookiexcb_record_create_context(connection,context,0,1,1,clients,range);xcb_flush(connection);xcb_record_enable_context_cookie_t enable_cookiexcb_record_enable_context(connection,context);std::unique_ptrxcb_record_enable_context_reply_treply;while(1){reply.reset(xcb_record_enable_context_reply(connection,enable_cookie,NULL));uint8_t*dataxcb_record_enable_context_data(reply.get());intlenxcb_record_enable_context_data_length(reply.get());xcb_generic_event_t*event(xcb_generic_event_t*)data;while((uint8_t*)eventdatalen){switch(event-response_type~0x80){caseXCB_BUTTON_PRESS:{autobtn_event(xcb_button_press_event_t*)event;printf( Mouse Button Press \n);printf( Button: %d\n,btn_event-detail);printf( Root Coordinates: (%f, %f)\n,btn_event-root_x,btn_event-root_y);}break;caseXCB_KEY_PRESS:{autokey_event(xcb_key_press_event_t*)event;printf( Key Press \n);printf( Key: %d\n,key_event-detail);printf( Mask: %d\n,key_event-state);}break;}event1;}}xcb_disconnect(connection);return0;}结语虽然XInput和Record都是同步阻塞的但是XInput直接调用xcb_wait_for_event等待事件到来而Record则依赖底层的xcb_wait_for_reply响应请求。由于XInput可以通过xcb_send_event模拟事件来唤醒xcb_wait_for_event而xcb_wait_for_reply目前暂未找到合适的方法因此更推荐使用XInput。

相关新闻

无人机视角农村房屋建筑损伤长植物返潮裂缝检测数据集VOC+YOLO格式1304张5类别

无人机视角农村房屋建筑损伤长植物返潮裂缝检测数据集VOC+YOLO格式1304张5类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1304标注数量(xml文件个数):1304标注数量(txt文件个数):1304标注类别…

2026/7/3 15:03:49 阅读更多 →
ManageEngine在阿联酋设立数据中心强化数据主权承诺

ManageEngine在阿联酋设立数据中心强化数据主权承诺

ManageEngine,作为Zoho Corporation旗下的企业IT管理部门,通过在阿联酋(UAE)推出数据中心,进一步强化了对中东地区的长期承诺。此举旨在解决日益增长的数据主权、监管合规和网络安全方面的担忧。ManageEngine首席执行官…

2026/7/5 5:42:03 阅读更多 →
真香警告!RAG技术让大模型“知识库“实时更新,小白也能变大神

真香警告!RAG技术让大模型“知识库“实时更新,小白也能变大神

一、引言:大模型的“致命痛点”,RAG来救场 1.1大模型的“尴尬时刻”:我们都遇到过的坑 家人们,用大模型的时候,是不是经常被这几个问题搞崩溃? 问它 2025 年的最新热点,它像个 “穿越者”&am…

2026/7/3 15:03:52 阅读更多 →

最新新闻

QLVideo:让Mac视频管理更高效的预览增强工具

QLVideo:让Mac视频管理更高效的预览增强工具

QLVideo:让Mac视频管理更高效的预览增强工具 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.com/gh_…

2026/7/6 4:48:24 阅读更多 →
Jadx 1.5.2:安卓反编译工具的终极进化,Java代码还原更智能

Jadx 1.5.2:安卓反编译工具的终极进化,Java代码还原更智能

Jadx 1.5.2:安卓反编译工具的终极进化,Java代码还原更智能 【免费下载链接】jadx Dex to Java decompiler 项目地址: https://gitcode.com/gh_mirrors/ja/jadx Jadx是一款功能强大的安卓应用反编译工具,能够将APK、DEX等安卓应用文件转…

2026/7/6 4:48:24 阅读更多 →
FinalBurn Neo:打造完美复古街机游戏体验的终极指南

FinalBurn Neo:打造完美复古街机游戏体验的终极指南

FinalBurn Neo:打造完美复古街机游戏体验的终极指南 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo FinalBurn Neo(简称FBNeo)是一款开源的街机游戏模拟器&#xff0…

2026/7/6 4:44:23 阅读更多 →
3个关键问题:如何通过WSC API安全管理Windows Defender?

3个关键问题:如何通过WSC API安全管理Windows Defender?

3个关键问题:如何通过WSC API安全管理Windows Defender? 【免费下载链接】no-defender A slightly more fun way to disable windows defender firewall. (through the WSC api) 项目地址: https://gitcode.com/GitHub_Trending/no/no-defender …

2026/7/6 4:44:23 阅读更多 →
珀斯与袋鼠岛之旅:波浪岩与野生海鲜市场探访

珀斯与袋鼠岛之旅:波浪岩与野生海鲜市场探访

珀斯与袋鼠岛之旅:波浪岩与野生海鲜市场探访从西澳大利亚州的首府珀斯出发,向东驱车约340公里,可抵达海登附近的波浪岩。这块巨大的花岗岩体高约15米,长度约110米,其岩石表面因长期的风化与水蚀作用,形成了…

2026/7/6 4:42:23 阅读更多 →
叶兴阳双语音标,英语发音工具断层级天花板

叶兴阳双语音标,英语发音工具断层级天花板

功能向实测评价:叶兴阳双语音标,英语发音工具断层级天花板 深耕英语学习多年,试过市面各类音标教辅、发音软件、双语读物,唯有叶兴阳双语音标在功能性上做到全方位无短板,每一项核心功能都精准戳中自学、教学、精读全场…

2026/7/6 4:38:22 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻