news 2026/3/31 20:29:16

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/3/25 17:57:52

程序员必看!RAG系统调优实战,没有银弹只有数据说话

先给大家一图流总结全文&#xff1a; RAG这个东西&#xff0c;圈内公认是「一周出Demo&#xff0c;半年就弃用」。 前段时间有个朋友找到我&#xff0c;他们搭建了个RAG系统&#xff0c;给合作伙伴解答平台使用方面的咨询。 结果上线后&#xff0c;内部用户的吐槽反馈不断&am…

作者头像 李华
网站建设 2026/3/29 10:45:20

网络安全跻身英国五大增长最快职业领域

根据英国国家统计局对400多个职业的追踪分析显示&#xff0c;网络安全已成为英国第五大增长最快的职业&#xff0c;从2021年以来该领域从业人员数量几乎增长了两倍&#xff0c;达到83700人。托管安全服务提供商Socura进行的这项分析表明&#xff0c;网络安全专业人员现在比建筑…

作者头像 李华
网站建设 2026/3/23 9:44:12

大数据领域数据仓库的安全审计流程

大数据领域数据仓库的安全审计流程:给数据仓库做一次"全面体检" 关键词:数据仓库、安全审计、访问控制、风险评估、合规性检查 摘要:在大数据时代,数据仓库作为企业核心数据资产的"数字金库",存储着客户信息、交易记录、业务机密等敏感数据。如何确保…

作者头像 李华
网站建设 2026/3/31 6:24:03

AI审核系统容灾设计:保证99.99%可用性的方法

AI审核系统容灾设计:保证99.99%可用性的技术实践 一、引言:为什么AI审核系统的容灾设计比你想象中更重要? 1. 一个真实的“灾难”案例:某电商平台的大促惊魂 2023年双11零点,某头部电商平台的AI审核系统突然崩溃。原本应该实时审核的“预售商品描述合规性”流程陷入停滞…

作者头像 李华
网站建设 2026/3/26 9:52:28

UltraRAG 3.0:零代码构建RAG系统,从入门到实战指南

清华大学THUNLP实验室等机构推出UltraRAG 3.0&#xff0c;全球首个基于MCP架构的轻量级RAG开发框架。通过模块化设计、YAML配置驱动和可视化IDE&#xff0c;大幅降低RAG系统开发门槛。支持自动适配知识库、多模态处理等创新技术&#xff0c;实现从"能用"到"好用…

作者头像 李华