树莓派4B变身便携WiFi热点:create_ap配置全流程(含VNC远程控制技巧)

核心内容摘要

导师推荐!专科生必备!2026 TOP9 AI论文软件测评:开题报告/文献综述全攻略
Hunyuan-MT-7B开源可部署:提供Docker Compose一键启停编排文件

Qwen-Image-Lightning体验:4步生成电商级产品宣传图

前言在现代Linux桌面开发中高效、低延迟的输入事件处理至关重要。

XCB作为X11协议的现代化接口不仅提供更优的性能还通过其无状态、异步的设计为输入监听带来了革命性的改进。

本文将深入探讨如何使用XCB实现高性能的全局键盘鼠标输入监听构建响应灵敏的桌面应用。

X11输入事件系统架构略基础键鼠事件监听XCB原生事件同样不支持键盘鼠标的全局监听因此同样选择通过额外的扩展来实现监听。

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

高级键鼠事件监听

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(

{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_y

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

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(

{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~0x

{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。

麻花视频V3.2.2纯净版-麻花视频V3.2.2纯净版应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123