linux X11窗口开发

news2024/11/17 14:45:18

X11 控制窗口

窗口信息查询

检索窗口信息工具 xprop
xprop执行后会出现一个光标,这个光标可以获取到窗口信息
在这里插入图片描述

X11 获取窗口信息,操作窗口

X11 遍历获取当前显示窗口的标题 _NET_WM_NAME, 置顶模拟键盘输入操作

开发依赖

apt install libX11-dev libXtst-dev

头文件

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysysm.h>
#include <X11/extensions/XTest.h>

编译关联

g++ -o main main.cpp -lX11 -lXtst

1.获取当前的显示和根窗口

Display* display = XOpenDisplay(NULL);
if (display == NULL) {
    std::cerr << "Unable to open display" << std::endl;
    return -1;
}
Window root = XDefaultRootWindow(display);
PrintAllWindows(display, root);
XCloseDisplay(display);

2.遍历当前窗口所有的子窗口

void PrintAllWindows(Display* display, Window root) {
    Window parent;
    Window* children;
    unsigned int num_children;
    char* windowName;
    if (XQueryTree(display, root, &root, &parent, &children, &num_children)) {
        for (unsigned int i = 0; i < num_children; i++) {
            PrintWindowInfo(display, children[i]);
            PrintAllWindows(display, children[i]);
        }
        if (children) {
            XFree(children);
        }
    }
}

3.窗口信息查看

void PrintWindowInfo(Display* display, Window window) {
    Atom ca = XInternAtom(display, "_NET_WM_NAME", False);
    Atom actual_type;
    int  actual_format;
    unsigned long nitems, bytes_after;
    unsigned char* prop_return = NULL;
    if (XGetWindowProperty(display, window, ca, 0, (~0L), False, AnyPropertyType,
    &actual_type, &actual_format, &nitems, &bytes_after, &prop_return) == Success) {
        std::string value;
        value.assign((char*)prop_return, nitems);
        std::cout << "atom:" << XGetAtomName(display, ca) << std::endl;
        std::cout << "Value:" << value << std::endl;
        std::cout << "window:" << window << std::endl;
        }
    }
}

4.窗口置顶

void ActivateWindow(Display* display, Window window) {
    XEvent event = { 0 };
    event.xclient.type = ClientMessage;
    event.xclient.message_type = XInternAtom(display, "_NET_ACTIVE_WINDOW", False);
    event.xclient.display = display;
    event.xclient.window = window;
    event.xclient.format = 32;
    event.xclient.data.l[0] = 2;
    event.xclient.data.l[1] = CurrentTime;
    event.xclient.data.l[2] = 0;
    event.xclient.data.l[3] = 0;
    event.xclient.data.l[4] = 0;
    Window root = XDefaultRootWindow(display);
    XSendEvent(display, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &event);
}

5.模拟键盘按键

unsigned int keycode = XKeysymToKeyCode(display, XK_Page_Down);
XTestFakeKeyEvent(display, keycode, True, 0);
XTestFakeKeyEvent(display, keycode, False, 0);

X11 屏幕抓取转为png base64输出

依赖安装

apt install libpng-dev libX11-dev

编译

g++ -o screen ScreenCap.cpp base64.cpp -lpng -lX11
#include <iostream>
#include <vector>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <png.h>
#include <base64/base64.h>


void userWriteData(png_structp png_ptr, png_bytep data, png_size_t length) {
    std::vector<uint8_t>* p = (std::vector<uint8_t>*) png_get_io_ptr(png_ptr);
    p->insert(p->end(), data, data + length);
}




int main() {
    Display* display = XOpenDisplay(NULL);
    Window root = DefaultRootWindow(display);
    XWindowAttributes gwa;
    XGetWindowAttributes(display, root, &gwa);
    int width = gwa.width;
    int height = gwa.height;


    XImage* image = XGetImage(display, root, 0, 0, width, height, AllPlanes, ZPixmap);


    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    setjmp(png_jmpbuf(png));


    std::vector<uint8_t> buffer;


    png_set_write_fn(png, &buffer, userWriteData, NULL);


    png_set_IHDR(
        png,
        info,
        width, height,
        8,
        PNG_COLOR_TYPE_RGBA,
        PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT,
        PNG_FILTER_TYPE_DEFAULT
    );


    png_write_info(png, info);


    png_bytep row = (png_bytep) malloc(4 * width * sizeof(png_byte));
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            uint32_t pixel = XGetPixel(image, x, y);
            row[x*4] = (pixel >> 16) & 0xFF;
            row[x*4 + 1] = (pixel >> 8) & 0xFF;
            row[x*4 + 2] = pixel & 0xFF;
            row[x*4 + 3] = 0xFF;
        }
        png_write_row(png, row);
    }
    png_write_end(png, NULL);


    png_destroy_write_struct(&png, &info);
    free(row);
    XFree(image);
    XCloseDisplay(display);


    std::string b64_data = base64_encode(buffer.data(), buffer.size(), false);


    std::cout << b64_data << std::endl;


    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端Vue】社交信息头条项目完整笔记第2篇:二、登录注册,准备【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配,关于 , 配置文件,封装请求模块。十、用户关…

LeetCode-1669题:合并两个链表(原创)

【题目描述】 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果链表的头指针。 【…

10 - Debian如何让特定用户切换root身份

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何让特定用户切换root身份 《傅老师Debian小知识库系列之10》——原创 前言 傅老师Debian小知识库特点&#xff1a; 1、最小化拆解Debian实用技能…

LNMP架构之mysql数据库实战

mysql安装 到官网www.mysql.com下载源码版本 实验室使用5.7.40版本 tar xf mysql-boost-5.7.40.tar.gz #解压 cd mysql-boost-5.7.40/ yum install -y cmake gcc-c bison #安装依赖性 cmake -DCMAKE_INSTALL_PREFIX/usr/local/mysql -DMYSQL_DATADIR/data/mysql -DMYSQL_…

MySQL为什么会选错索引

在平时不知道一有没有遇到过这种情况&#xff0c;我明明创建了索引&#xff0c;但是MySQL为何不用索引呢&#xff1f;为何要进行全索引扫描呢&#xff1f; 一、对索引进行函数操作 假设现在维护了一个交易系统&#xff0c;其中交易记录表 tradelog 包含交易流水号(tradeid)、交…

【分布式计算框架】Hadoop伪分布式安装

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 文章目录 Hadoop伪分布式安装一、实验目的二、实验环境三、实验内容基本任务1&#xff1a;安装Linux虚拟机(至…

[Vue3] 配置 Pinia 并存储、读取、修改数据 | 集中式状态(数据)管理

安装 npm i pinia main.ts import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import { createPinia } from pinia // 引入Pinia// 创建一个应用 const app createApp(App)const pina createPinia() app.use(pina) // 挂载整个应用到app容器…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f3af; 掌握APISIX中多种负载均衡策略的原理及其适用场景。&#x1f4c8; 学习如何通过APISIX的Admin API和Dashboard进行负…

AIGC趋势下软件工程强智能编码来临了么?

一、背景 在AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;的趋势下&#xff0c;软件工程领域的“强智能编码”是指通过深度学习、自然语言处理等前沿技术&#xff0c;使AI具备理解、学习、推理和生成代码的能力&#xff0c;从而实现自动化或…

操作系统:经典进程同步问题的高级探讨

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

ChatGPT提升工作生产力方法和技巧ChatGPT enhances work productivity methods and techniques

使用ChatGPT提升工作效率的一些详细步骤和技巧&#xff1a; 1. 快速撰写和编辑文档 撰写文档&#xff1a;当需要撰写报告、方案、邮件等内容时&#xff0c;可以直接向ChatGPT提出请求&#xff0c;例如&#xff1a;“请帮我写一份关于第一季度销售业绩的总结报告。”之后&#x…

Mybatis-plus + 通用mapper(tk.mybatis)

推荐课程&#xff1a;MyBatisPlus实战教程02-课程介绍与案例演示_哔哩哔哩_bilibili 官网&#xff1a;MyBatis-Plus (baomidou.com) 目录 01 引言 1&#xff09;MyBatis与MyBatis-Plus区别 2&#xff09;Mybatis-plus入门案例 案例一&#xff1a;spring容器版本的案例 案例…

将二进制数a的每一位右移b位operator.rshift(a,b)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将二进制数a的 每一位右移b位 operator.rshift(a,b) [太阳]选择题 请问执行operator.rshift(4, 1)的结果为&#xff1f; import operator print("【显示】二进制2&#xff1a;",bi…

Tuxera for Mac2024免费读写硬盘U盘工具

作为软件产品专家&#xff0c;我对各类软件都有较为深入的了解&#xff0c;下面介绍Tuxera for Mac这款读写硬盘/U盘工具的相关信息&#xff1a; Tuxera for Mac是一款高效稳定的NTFS读写工具&#xff0c;专为解决Mac系统无法直接读写NTFS格式驱动器的问题而设计。它提供了完整…

【文献分享】FLUNED(一种用于流体活化计算的开源工具)在水中的开发和验证

题目&#xff1a;Development and validation in water of FLUNED, an open-source tool for fluid activation calculations 链接&#xff1a;Redirecting FLUNED&#xff08;一种用于流体活化计算的开源工具&#xff09;在水中的开发和验证 在核聚变装置中&#xff0c;高…

【数据结构】树、二叉树与堆(长期维护)

下面是关于树、二叉树、堆的一些知识分享&#xff0c;有需要借鉴即可。 一、初识树&#xff08;了解即可&#xff09; 1.树的概念 概念&#xff1a;一种非线性数据结构&#xff0c;逻辑形态上类似倒挂的树 树的构成&#xff1a;由一个根左子树右子树构成&#xff0c;其中子树…

布隆过滤器详讲

本文旨在讲解布隆过滤器的原理以及实现方式&#xff0c;希望通过本文能使读者对布隆过滤器有一定的认识&#xff01; 一、布隆过滤器的引入 在讲解布隆过滤器之前&#xff0c;我们还是先提及一下前面讲的位图行&#xff0c;位图可以处理大量的数据&#xff0c;广泛用于查找等…

Vue-vue3

一、Vue3简介二、Vue3有那些优化性能的提升源码升级拥抱TypeScript新的特性 三、创建Vue3.0工程四、Vue3工程结构&#xff08;使用cli创建的vue3&#xff09;五、常用的Composition API&#xff08;组合式API&#xff09;setupsetup的两个注意点 ref函数reactive函数Vue3.0中的…

【Java程序设计】【C00381】基于(JavaWeb)Springboot的爱心商城管理系统(有论文)

【C00381】基于&#xff08;JavaWeb&#xff09;Springboot的爱心商城管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#x…

SSH 连接工具-Tabby(使用教程)

文章目录 SSH 连接工具-Tabby&#xff08;使用教程&#xff09;1.Tabby简介2.Tabby安装3.实现 SSH 远程连接4.SFTP文件传输5.将 Anaconda Prompt 配置到 Tabby 中 SSH 连接工具-Tabby&#xff08;使用教程&#xff09; 提起 SSH 大家首先想到的应该是国内的一款 Xshell 工具&a…