news 2026/5/16 6:18:31

linux 使用Xcb监听键盘鼠标输入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux 使用Xcb监听键盘鼠标输入

前言

在现代Linux桌面开发中,高效、低延迟的输入事件处理至关重要。XCB作为X11协议的现代化接口,不仅提供更优的性能,还通过其无状态、异步的设计为输入监听带来了革命性的改进。
本文将深入探讨如何使用XCB实现高性能的全局键盘鼠标输入监听,构建响应灵敏的桌面应用。

X11输入事件系统架构

基础键鼠事件监听

XCB原生事件同样不支持键盘鼠标的全局监听,因此,同样选择通过额外的扩展来实现监听。

2.1 键码解析

由于XCB库没有提供完整的键盘映射函数,而事件KeyCode和修饰符状态,与X11完全一样,因此直接使用X11的转换函数即可。

高级键鼠事件监听

3.1 XInput扩展
intmain(){xcb_connection_t*conn=xcb_connect(NULL,NULL);if(xcb_connection_has_error(conn)){fprintf(stderr,"XCB连接失败\n");return-1;}xcb_prefetch_extension_data(conn,&xcb_input_id);autorecord_ext=xcb_get_extension_data(conn,&xcb_input_id);if(!record_ext||!record_ext->present){fprintf(stderr,"XInput 扩展不可用\n");return-1;}autoroot=xcb_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_ptr<xcb_generic_event_t>event(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_x>>16,key_event->root_y>>16);}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*connection=xcb_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_ext=xcb_get_extension_data(connection,&xcb_record_id);if(!record_ext||!record_ext->present){fprintf(stderr,"RECORD 扩展不可用\n");return-1;}xcb_record_client_spec_t clients=XCB_RECORD_CS_ALL_CLIENTS;xcb_record_context_t context=xcb_generate_id(connection);xcb_record_range_t range;memset(&range,0,sizeof(range));range.device_events.first=XCB_KEY_PRESS;range.device_events.last=XCB_BUTTON_PRESS;xcb_void_cookie_t create_cookie=xcb_record_create_context(connection,context,0,1,1,&clients,&range);xcb_flush(connection);xcb_record_enable_context_cookie_t enable_cookie=xcb_record_enable_context(connection,context);std::unique_ptr<xcb_record_enable_context_reply_t>reply;while(1){reply.reset(xcb_record_enable_context_reply(connection,enable_cookie,NULL));uint8_t*data=xcb_record_enable_context_data(reply.get());intlen=xcb_record_enable_context_data_length(reply.get());xcb_generic_event_t*event=(xcb_generic_event_t*)data;while((uint8_t*)event<data+len){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;}event+=1;}}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。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 0:16:02

东南亚海外仓商品SKU标准化,降低错发率提升仓库运营效率

作为深耕东南亚的海外仓老板&#xff0c;今天聊聊卖家常吐槽的SKU审核&#xff0c;常有客户抱怨&#xff1a;“规则这么多&#xff0c;是不是故意刁难&#xff1f;要短、不能相似、不能纯数字或带符号&#xff0c;还得传图填尺寸&#xff0c;太麻烦&#xff01;” 其实&#x…

作者头像 李华
网站建设 2026/5/14 2:37:49

蚕豆病人群营养补充有讲究,万和制药和安胶囊可安心选用

蚕豆病作为 G-6-PD 缺乏症&#xff0c;核心风险在于氧化物质诱发红细胞溶血&#xff0c;因此这类人群的营养补充&#xff0c;需严格规避高浓度氧化风险成分&#xff0c;同时兼顾营养与免疫维护。万和制药和安 复方氨基酸胶囊&#xff08;8-11&#xff09;&#xff0c;经成分与…

作者头像 李华
网站建设 2026/5/11 8:55:55

2026年中大型企业数电乐企解决方案选型参考:主流方案对比及应用场景适配建议

随着数电发票改革的全面推进&#xff0c;企业财务管理面临向数字化、自动化转型的关键阶段。数电乐企解决方案旨在帮助企业实现发票数据的全流程自动化处理&#xff0c;并与税务系统高效衔接。本文从系统能力、场景适配、实施反馈等维度&#xff0c;对当前市场中的三款数电乐企…

作者头像 李华
网站建设 2026/5/9 1:29:31

安全经理的CISSP备考之路!精进专业技能,成为了我必须坚持的事

作为一家上市公司的网络安全经理&#xff0c;每天都要和行业内专业人士深度对接&#xff0c;也愈发感受到这个领域的发展速度——新工具、新技术持续迭代&#xff0c;行业对从业者的专业要求也在不断提升。想要不被行业淘汰&#xff0c;保持核心竞争力&#xff0c;持续学习、精…

作者头像 李华
网站建设 2026/5/13 21:27:37

【软件测试】11_性能测试实战 _编写性能测试报告

文章目录一、项目概况二、测试目的三、测试范围四、测试环境及工具4.1 性能测试环境的基本配置4.2 测试工具五、测试记录及结果分析5.1 单场景负载测试-获取首页数据5.1.1 场景描述5.1.2 测试结果数据5.1.3 问题分析5.1.4 解决方案六、测试结论七、总结7.1 编写测试报告的要点7…

作者头像 李华
网站建设 2026/5/9 1:29:42

物理世界模型驱动:Franka Research 3 机械臂的“零样本”进化之路

在当前的机器人研究领域&#xff0c;如何让机械臂像人类一样通过“观看”视频就学会复杂的动作&#xff0c;是一个极具挑战性的前沿课题。近期&#xff0c;由 Google DeepMind、斯坦福大学等机构联合提出的 PhysWorld 框架&#xff0c;通过将视频生成与物理世界建模相结合&…

作者头像 李华