news 2026/9/11 15:05:37

linux 使用Xcb监听窗口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux 使用Xcb监听窗口

前言

在Linux桌面开发领域,XCB(X C Binding)作为Xlib的现代化替代品,正逐渐成为X11编程的主流选择。
与传统Xlib相比,XCB提供了更小的内存占用、更好的性能、直接的协议访问以及出色的异步支持。
本文将深入探讨如何使用XCB进行高效窗口事件监听,构建响应迅速的桌面应用。

XCB vs Xlib:为何选择XCB?

1.1 核心优势对比
特性XlibXCB优势
架构同步、有状态异步、无状态更好的并发性
内存占用较高极低适合资源受限环境
延迟隐藏优秀减少等待时间
线程安全需要锁原生支持简化多线程编程
协议扩展间接访问直接访问更精细的控制

Xcb 窗口监听实现

2.1 建立连接
#include<xcb/xcb.h>#include<stdio.h>#include<stdlib.h>intmain(){xcb_conn_t*conn=xcb_connect(NULL,NULL);if(xcb_conn_has_error(conn)){fprintf(stderr,"XCB连接失败\n");return-1;}autoroot=xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;printf("XCB连接成功\n");printf("根窗口 ID: %lu\n",root);// ...xcb_disconnect(conn);return0;}
2.2 监听窗口事件
uint32_tmask=XCB_EVENT_MASK_PROPERTY_CHANGE|XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;xcb_change_window_attributes(conn.get(),root,XCB_CW_EVENT_MASK,&mask);// 等待请求完成xcb_flush(conn.get());while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));switch(event->response_type&~0x80){caseXCB_PROPERTY_NOTIFY:break;caseXCB_CONFIGURE_NOTIFY:break;default:break;}}
2.3 获取窗口属性信息
voidprint_window_info(xcb_connection_t*conn,xcb_window_t window){// 获取窗口标题xcb_atom_t atom=get_intern_atom(conn,strlen("_NET_WM_NAME"),"_NET_WM_NAME");autocookie=xcb_get_property(conn,0,window,atom,XCB_GET_PROPERTY_TYPE_ANY,0,(~0u));std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(conn,cookie,NULL));if(reply){printf("窗口标题: %s\n",(char*)xcb_get_property_value(reply.get()));}// 获取窗口进程xcb_atom_t atom_pid=get_intern_atom(conn,strlen("_NET_WM_PID"),"_NET_WM_PID");xcb_get_property_cookie_t cookie=xcb_get_property(conn,0,window,atom_pid,XCB_ATOM_CARDINAL,0,1);std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(conn,cookie,NULL));if(reply){printf("所属进程: %d\n",*((pid_t*)xcb_get_property_value(reply.get())));}// 获取窗口尺寸xcb_get_geometry_cookie_t geom_cookie=xcb_get_geometry(conn,window);std::unique_ptr<xcb_get_geometry_reply_t>geom(xcb_get_geometry_reply(conn,geom_cookie,nullptr));if(geom){// 获取窗口属性xcb_window_t root=xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;// 转换坐标:从窗口局部坐标 (0,0) 到根窗口坐标xcb_translate_coordinates_cookie_t trans_cookie=xcb_translate_coordinates(conn,window,root,0,0);std::unique_ptr<xcb_translate_coordinates_reply_t>trans(xcb_translate_coordinates_reply(conn,trans_cookie,nullptr));if(trans){printf("位置: %dx%d 大小: %dx%d\n",trans->dst_x,trans->dst_y,geom->width,geom->height);}}}

高级监听功能

3.1 监听活动窗口
uint32_tmask=XCB_EVENT_MASK_PROPERTY_CHANGE;// 监听窗口属性和子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,&mask);// 监听活动窗口IDxcb_atom_t active_window_atom=get_intern_atom(conn,strlen("_NET_ACTIVE_WINDOW"),"_NET_ACTIVE_WINDOW");while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));uint8_ttype=event->response_type&~0x80;if(type==XCB_PROPERTY_NOTIFY){xcb_property_notify_event_t*prop=(xcb_property_notify_event_t*)event.get();if(prop->atom==active_window_atom){xcb_get_property_cookie_t cookie=xcb_get_property(connection,0,root,active_window_atom,XCB_ATOM_WINDOW,0,1);std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(connection,cookie,NULL));if(reply){printf("活动窗口变更: %lu\n",*((xcb_window_t*)xcb_get_property_value(reply.get())));}}}}
3.2 监听窗口属性变化
uint32_tmask=XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;// 监听子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,&mask);while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));uint8_ttype=event->response_type&~0x80;if(type==XCB_CONFIGURE_NOTIFY){// 这里存在X11一样的问题xcb_configure_notify_event_t*conf=(xcb_configure_notify_event_t*)event.get();printf("窗口大小/位置变化: ID=%lu, %dx%d @ %d,%d\n",conf->window,conf->width,conf->height,conf->x,conf->y);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 4:58:41

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

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

作者头像 李华
网站建设 2026/8/30 17:17:35

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

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

作者头像 李华
网站建设 2026/9/7 6:23:30

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

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

作者头像 李华
网站建设 2026/9/2 23:57:25

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

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

作者头像 李华
网站建设 2026/9/8 13:15:32

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

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

作者头像 李华
网站建设 2026/9/4 6:49:27

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

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

作者头像 李华