news 2026/6/10 16:09:13

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/6/10 13:01:00

使用vue时的一些注意事项

1.vue2开发中一些注意事项 1.1数据响应式问题 // ❌ Bug&#xff1a;直接通过索引修改数组元素不会触发更新 this.items[0] new value// ❌ 修改数组长度不会触发更新 this.items.length 0解决方案&#xff1a; // ✅ 使用Vue.set或$set this.$set(this.items, 0, new value)…

作者头像 李华
网站建设 2026/6/10 12:59:35

拣货慢、错发多?1个策略,让东南亚海外仓一件代发效率翻倍!

做东南亚海外仓的同行都懂&#xff0c;最头疼的不是整箱入库&#xff0c;而是零散订单——Shopee、Lazada、TikTok Shop本土零售单、退货单&#xff0c;稍不注意就错发漏发、库存对账难&#xff0c;既耗人力又丢客户。行业数据显示&#xff0c;像一件代发这种拆零拣货占会整个仓…

作者头像 李华
网站建设 2026/6/10 13:01:51

大模型落地实践:97个精选案例助你掌握AI前沿应用技术

《大模型典型示范应用案例集》由阿里云携手99家合作伙伴共同发布&#xff0c;从数百个案例中精选97个优秀案例&#xff0c;分为行业赋能、智能应用和生态服务三类&#xff0c;覆盖医疗、金融、能源等多领域。报告显示上海成为大模型应用热土&#xff0c;大中型企业是主要试验场…

作者头像 李华
网站建设 2026/6/10 12:56:00

2026云+AI应用研究报告:行业大模型落地实战指南

行业大模型是产业智能化升级的关键引擎&#xff0c;云计算已跃升为AI创新核心支撑。AI行业云平台凭借数据基础、安全合规、应用生态等五大优势&#xff0c;成为行业AI应用最佳载体&#xff0c;提供高质量数据、安全机制并降低开发门槛。"AI大模型领地"知识星球提供1万…

作者头像 李华
网站建设 2026/6/10 14:11:55

Python+django基于小程序的民宿预订系统-web pc 手机端

文章目录 系统概述技术架构核心功能特色设计部署方案代码示例&#xff08;Django 模型&#xff09; 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 PythonDjango 开发的民宿预订系统是…

作者头像 李华
网站建设 2026/6/10 13:02:02

大模型实战案例:运营商如何从“管道“到“智能服务商“的华丽转身

中国运营商借助5GAI技术&#xff0c;从管道提供商转型为智能服务商。文章通过黑龙江数字政府、辽宁12345热线、四川方言保护等20场景案例&#xff0c;展示大模型在政务、社会服务领域的应用成效&#xff0c;实现效率提升和成本降低。同时指出AI落地面临数据融合、高昂训练成本和…

作者头像 李华