当前位置: 首页 > news >正文

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。

http://www.jsqmd.com/news/322933/

相关文章:

  • 26年寒假生活指导1.30
  • SAP克服艰难开局实现8%增长
  • C++面向对象入门:实验三
  • ManageEngine在阿联酋设立数据中心强化数据主权承诺
  • 东南亚海外仓商品SKU标准化,降低错发率提升仓库运营效率
  • AI大模型应用实践:40个高价值场景+151个典型应用+66个央企大模型清单
  • 网络安全跻身英国五大增长最快职业领域
  • 基于微信小程序的高校学生社团活动管理系统的设计和实现
  • 一文掌握大模型AI在行政管理中的高效应用技巧
  • 真香警告!RAG技术让大模型“知识库“实时更新,小白也能变大神
  • 拣货慢、错发多?1个策略,让东南亚海外仓一件代发效率翻倍!
  • Python+django基于小程序的企业员工考勤打卡系统设计与实现-
  • AI杀疯了!当大模型遇见结构化数据,这个“翻译官“技术让业务人员也能玩转SQL查询
  • 程序员必看!RAG系统调优实战,没有银弹只有数据说话
  • Python+django基于小程序的大学运动会比赛报名系统as6e8
  • 海外仓必看!这4类仓库已被跨境卖家集体避雷,附管理破局方案
  • Postman使用教程 - 教程
  • 自然语言处理在AI原生应用中的7个关键技术解析
  • 复杂推理任务协调中元控制器的决策优化研究
  • Python+django基于小程序的民宿预订系统-web pc 手机端
  • P4462 [CQOI2018] 异或序列
  • 检索增强生成(RAG)落地实践:深入剖析痛点与系统性解决方案
  • AI+企业办公:8大核心应用场景深度解析,从入门到精通
  • 大数据领域数据仓库的安全审计流程
  • 为什么要学习大模型应用开发?2026大模型学习宝典:零基础入门到高薪offer的进阶之路
  • 大模型实战案例:运营商如何从“管道“到“智能服务商“的华丽转身
  • 政务大模型应用全攻略:政策解析、技术路线与实践案例,助力开发者入门
  • 2026云+AI应用研究报告:行业大模型落地实战指南
  • 万字长文详解具身智能:从基础到LLMs/WMs赋能,小白也能轻松掌握大模型应用
  • 2026国产大模型全面爆发:从参数竞赛到实用价值跃迁,程序员必学收藏指南