#include <X11/Xlib.h> #include <X11/Xatom.h> #include <X11/Xutil.h>
//获取窗口图片后,在QListWidget中显示,图片缩放大小为210*100
const QSize IMAGE_SIZE(210, 100); const QSize ITEM_SIZE(210, 120); static Display *xdisplay = 0; Display *disp() { if (!xdisplay) xdisplay = XOpenDisplay(NULL); return xdisplay; } void cleanupDisplay() { if (!xdisplay) return; XCloseDisplay(xdisplay); xdisplay = 0; } bool ewmhIsSupported() { Display *display = disp(); Atom netSupportingWmCheck = XInternAtom(display, "_NET_SUPPORTING_WM_CHECK", true); Atom actualType; int format = 0; unsigned long num = 0, bytes = 0; unsigned char *data = NULL; Window ewmh_window = 0; int status = XGetWindowProperty(display, DefaultRootWindow(display), netSupportingWmCheck, 0L, 1L, false, XA_WINDOW, &actualType, &format, &num, &bytes, &data); if (status == Success) { if (num > 0) { ewmh_window = ((Window *)data)[0]; } if (data) { XFree(data); data = NULL; } } if (ewmh_window) { status = XGetWindowProperty(display, ewmh_window, netSupportingWmCheck, 0L, 1L, false, XA_WINDOW, &actualType, &format, &num, &bytes, &data); if (status != Success || num == 0 || ewmh_window != ((Window *)data)[0]) { ewmh_window = 0; } if (status == Success && data) { XFree(data); } } return ewmh_window != 0; } //枚举所有窗口 std::list<Window> getTopLevelWindows() { std::list<Window> res; if (!ewmhIsSupported()) { qDebug("Unable to query window list " "because window manager " "does not support extended " "window manager Hints"); return res; } Atom netClList = XInternAtom(disp(), "_NET_CLIENT_LIST", true); Atom actualType; int format; unsigned long num, bytes; Window *data = 0; for (int i = 0; i < ScreenCount(disp()); ++i) { Window rootWin = RootWindow(disp(), i); int status = XGetWindowProperty(disp(), rootWin, netClList, 0L, ~0L, false, AnyPropertyType, &actualType, &format, &num, &bytes, (uint8_t **)&data); if (status != Success) { qDebug("Failed getting root " "window properties"); continue; } for (unsigned long i = 0; i < num; ++i) res.push_back(data[i]); XFree(data); } return res; } std::string getWindowAtom(Window win, const char *atom) { Atom netWmName = XInternAtom(disp(), atom, false); int n; char **list = 0; XTextProperty tp; std::string res = "unknown"; XGetTextProperty(disp(), win, &tp, netWmName); if (!tp.nitems) XGetWMName(disp(), win, &tp); if (!tp.nitems) return "error"; if (tp.encoding == XA_STRING) { res = (char *)tp.value; } else { int ret = XmbTextPropertyToTextList(disp(), &tp, &list, &n); if (ret >= Success && n > 0 && *list) { res = *list; XFreeStringList(list); } } XFree(tp.value); return res; } inline std::string getWindowName(Window win) { return getWindowAtom(win, "_NET_WM_NAME"); }
将窗口显示到QListWidget中
int index = 0; for (Window win : getTopLevelWindows()) {
//获取窗口属性 XWindowAttributes attrs; XGetWindowAttributes(disp(), win, &attrs);
//XGetImage获取XImage,并通过转换得到QPixmap XImage * pImage = XGetImage(disp(), win, 0, 0, attrs.width, attrs.height, AllPlanes, ZPixmap); QImage image = QImage((const uchar *)(pImage->data), pImage->width, pImage->height, pImage->bytes_per_line, QImage::Format_RGB32); QPixmap pixmap = QPixmap::fromImage(image);
//将QPixmap和窗口名添加到QListWidgetItem中,并将item添加到QListWidget中 QListWidgetItem *listWidgetItemScreen = new QListWidgetItem(QIcon(pixmap.scaled(IMAGE_SIZE)), getWindowName(win).c_str()); listWidgetItemScreen->setSizeHint(ITEM_SIZE); ui->listWidget->insertItem(index++, listWidgetItemScreen);
}
获取整个屏幕图像并显示到QListWidget中
//获取屏幕Window属性使用RootWindow函数获取
Window rootwin = RootWindow(disp(),0);
XWindowAttributes attrs; XGetWindowAttributes(disp(), rootwin, &attrs); XImage * pImage = XGetImage(disp(), rootwin, 0, 0, attrs.width, attrs.height, AllPlanes, ZPixmap); QImage image = QImage((const uchar *)(pImage->data), pImage->width, pImage->height, pImage->bytes_per_line, QImage::Format_RGB32); QPixmap pixmap = QPixmap::fromImage(image); QListWidgetItem *listWidgetItemScreen = new QListWidgetItem(QIcon(pixmap.scaled(IMAGE_SIZE)), "Screen"); listWidgetItemScreen->setSizeHint(ITEM_SIZE); ui->listWidget->insertItem(index++, listWidgetItemScreen);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南