小程序计算机毕设之基于springboot+Android的井盖隐患智能识别小程序的设计与开发(完整前后端代码+说明文档+LW,调试定制等)

核心内容摘要

3步解放双手:开源自动化工具提升游戏效率全攻略
语音转文字软件深度测评:4款工具准确率与效率对比

5分钟学会使用李慕婉-仙逆-造相Z-Turbo生成图片

前言在Linux桌面开发领域XCBX C Binding作为Xlib的现代化替代品正逐渐成为X11编程的主流选择。

与传统Xlib相比XCB提供了更小的内存占用、更好的性能、直接的协议访问以及出色的异步支持。

本文将深入探讨如何使用XCB进行高效窗口事件监听构建响应迅速的桌面应用。

XCB vs Xlib为何选择XCB

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

1 建立连接#includexcb/xcb.h#includestdio.h#includestdlib.hintmain(){xcb_conn_t*connxcb_connect(NULL,NULL);if(xcb_conn_has_error(conn)){fprintf(stderr,XCB连接失败\n);return-1;}autorootxcb_setup_roots_iterator(xcb_get_setup(conn)).data-root;printf(XCB连接成功\n);printf(根窗口 ID: %lu\n,root);// ...xcb_disconnect(conn);return0;}

2 监听窗口事件uint32_tmaskXCB_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(

{std::unique_ptrxcb_generic_event_tevent(xcb_wait_for_event(conn));switch(event-response_type~0x

{caseXCB_PROPERTY_NOTIFY:break;caseXCB_CONFIGURE_NOTIFY:break;default:break;}}

3 获取窗口属性信息voidprint_window_info(xcb_connection_t*conn,xcb_window_t window){// 获取窗口标题xcb_atom_t atomget_intern_atom(conn,strlen(_NET_WM_NAME),_NET_WM_NAME);autocookiexcb_get_property(conn,0,window,atom,XCB_GET_PROPERTY_TYPE_ANY,0,(~0u));std::unique_ptrxcb_get_property_reply_treply(xcb_get_property_reply(conn,cookie,NULL));if(reply){printf(窗口标题: %s\n,(char*)xcb_get_property_value(reply.get()));}// 获取窗口进程xcb_atom_t atom_pidget_intern_atom(conn,strlen(_NET_WM_PID),_NET_WM_PID);xcb_get_property_cookie_t cookiexcb_get_property(conn,0,window,atom_pid,XCB_ATOM_CARDINAL,0,

;std::unique_ptrxcb_get_property_reply_treply(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_cookiexcb_get_geometry(conn,window);std::unique_ptrxcb_get_geometry_reply_tgeom(xcb_get_geometry_reply(conn,geom_cookie,nullptr));if(geom){// 获取窗口属性xcb_window_t rootxcb_setup_roots_iterator(xcb_get_setup(conn)).data-root;// 转换坐标从窗口局部坐标 (0,

到根窗口坐标xcb_translate_coordinates_cookie_t trans_cookiexcb_translate_coordinates(conn,window,root,0,

;std::unique_ptrxcb_translate_coordinates_reply_ttrans(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);}}}高级监听功能

1 监听活动窗口uint32_tmaskXCB_EVENT_MASK_PROPERTY_CHANGE;// 监听窗口属性和子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,mask);// 监听活动窗口IDxcb_atom_t active_window_atomget_intern_atom(conn,strlen(_NET_ACTIVE_WINDOW),_NET_ACTIVE_WINDOW);while(

{std::unique_ptrxcb_generic_event_tevent(xcb_wait_for_event(conn));uint8_ttypeevent-response_type~0x80;if(typeXCB_PROPERTY_NOTIFY){xcb_property_notify_event_t*prop(xcb_property_notify_event_t*)event.get();if(prop-atomactive_window_atom){xcb_get_property_cookie_t cookiexcb_get_property(connection,0,root,active_window_atom,XCB_ATOM_WINDOW,0,

;std::unique_ptrxcb_get_property_reply_treply(xcb_get_property_reply(connection,cookie,NULL));if(reply){printf(活动窗口变更: %lu\n,*((xcb_window_t*)xcb_get_property_value(reply.get())));}}}}

2 监听窗口属性变化uint32_tmaskXCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;// 监听子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,mask);while(

{std::unique_ptrxcb_generic_event_tevent(xcb_wait_for_event(conn));uint8_ttypeevent-response_type~0x80;if(typeXCB_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);}}

XXXXXL18-XXXXXL20-XXXXXL18-XXXXXL20最新版N.18.14.12-2265安卓网应用

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

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