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

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);}}
http://www.jsqmd.com/news/322935/

相关文章:

  • 【笔记】【股票小白入门5-股票界面】
  • linux 使用Xcb监听键盘鼠标输入
  • 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应用研究报告:行业大模型落地实战指南