|
|
@@ -0,0 +1,1654 @@
|
|
|
+// #include "screenwall_simple.h"
|
|
|
+// #include <QApplication>
|
|
|
+// #include <QDesktopWidget>
|
|
|
+// #include <QScreen>
|
|
|
+// #include <QMouseEvent>
|
|
|
+// #include <QResizeEvent>
|
|
|
+// #include <QShowEvent>
|
|
|
+// #include <QHideEvent>
|
|
|
+// #include <QCloseEvent>
|
|
|
+// #include <QPainter>
|
|
|
+// #include <QDebug>
|
|
|
+// #include <QMessageBox>
|
|
|
+// #include <QToolTip>
|
|
|
+// #include <QStyle>
|
|
|
+// #include <QStyleOption>
|
|
|
+// #include <QFileInfo>
|
|
|
+// #include <QDir>
|
|
|
+// #include <QStandardPaths>
|
|
|
+// #include <QSettings>
|
|
|
+// #include <QJsonDocument>
|
|
|
+// #include <QJsonObject>
|
|
|
+// #include <QPushButton>
|
|
|
+// #include <QVBoxLayout>
|
|
|
+// #include <QHBoxLayout>
|
|
|
+// #include <QLabel>
|
|
|
+// #include <string>
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleWindowFinder Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// struct EnumWindowsData {
|
|
|
+// QVector<SimpleWindowInfo>* windows;
|
|
|
+// bool includeMinimized;
|
|
|
+// };
|
|
|
+
|
|
|
+// BOOL CALLBACK SimpleWindowFinder::enumWindowsProc(HWND hwnd, LPARAM lParam)
|
|
|
+// {
|
|
|
+// auto* data = reinterpret_cast<EnumWindowsData*>(lParam);
|
|
|
+
|
|
|
+// if (!isValidWindow(hwnd)) {
|
|
|
+// return TRUE;
|
|
|
+// }
|
|
|
+
|
|
|
+// bool isMinimized = IsIconic(hwnd);
|
|
|
+// if (!data->includeMinimized && isMinimized) {
|
|
|
+// return TRUE;
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleWindowInfo info;
|
|
|
+// info.hwnd = hwnd;
|
|
|
+// info.title = getWindowTitle(hwnd);
|
|
|
+// info.processName = getProcessName(hwnd);
|
|
|
+// info.isMinimized = isMinimized;
|
|
|
+// info.isVisible = IsWindowVisible(hwnd);
|
|
|
+
|
|
|
+// RECT rect;
|
|
|
+// GetWindowRect(hwnd, &rect);
|
|
|
+// info.geometry = QRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
|
|
|
+
|
|
|
+// GetWindowThreadProcessId(hwnd, &info.processId);
|
|
|
+
|
|
|
+// // 获取图标
|
|
|
+// info.icon = SimpleCacheManager::instance().getCachedIcon(hwnd);
|
|
|
+// if (info.icon.isNull()) {
|
|
|
+// info.icon = getWindowIcon(hwnd);
|
|
|
+// if (!info.icon.isNull()) {
|
|
|
+// SimpleCacheManager::instance().cacheIcon(hwnd, info.icon);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// data->windows->append(info);
|
|
|
+// return TRUE;
|
|
|
+// }
|
|
|
+
|
|
|
+// QVector<SimpleWindowInfo> SimpleWindowFinder::getWindowList(bool includeMinimized)
|
|
|
+// {
|
|
|
+// QVector<SimpleWindowInfo> windows;
|
|
|
+// EnumWindowsData data;
|
|
|
+// data.windows = &windows;
|
|
|
+// data.includeMinimized = includeMinimized;
|
|
|
+
|
|
|
+// EnumWindows(enumWindowsProc, reinterpret_cast<LPARAM>(&data));
|
|
|
+
|
|
|
+// return windows;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap SimpleWindowFinder::captureWindow(HWND hwnd, const QSize& size)
|
|
|
+// {
|
|
|
+// if (!IsWindow(hwnd)) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// // 检查缓存
|
|
|
+// QPixmap cached = SimpleCacheManager::instance().getCachedThumbnail(hwnd);
|
|
|
+// if (!cached.isNull() && (size.isEmpty() || cached.size() == size)) {
|
|
|
+// return cached;
|
|
|
+// }
|
|
|
+
|
|
|
+// RECT rect;
|
|
|
+// GetWindowRect(hwnd, &rect);
|
|
|
+// int width = rect.right - rect.left;
|
|
|
+// int height = rect.bottom - rect.top;
|
|
|
+
|
|
|
+// if (width <= 0 || height <= 0) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap pixmap;
|
|
|
+
|
|
|
+// // 简化的窗口捕获:直接使用屏幕截图方法
|
|
|
+// pixmap = captureScreenshot(hwnd, rect);
|
|
|
+// if (!pixmap.isNull()) {
|
|
|
+// qDebug() << "Captured window:" << hwnd << "size:" << width << "x" << height;
|
|
|
+// } else {
|
|
|
+// qDebug() << "Failed to capture window:" << hwnd;
|
|
|
+// // 如果截图失败,创建一个占位图像
|
|
|
+// pixmap = QPixmap(width > 0 ? width : 200, height > 0 ? height : 150);
|
|
|
+// pixmap.fill(QColor(64, 64, 64)); // 深灰色背景
|
|
|
+
|
|
|
+// QPainter painter(&pixmap);
|
|
|
+// painter.setPen(Qt::white);
|
|
|
+// painter.drawText(pixmap.rect(), Qt::AlignCenter, "无法捕获窗口");
|
|
|
+// }
|
|
|
+
|
|
|
+// // 缩放到指定尺寸
|
|
|
+// if (!pixmap.isNull()) {
|
|
|
+// if (!size.isEmpty() && pixmap.size() != size) {
|
|
|
+// pixmap = pixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
|
|
+// }
|
|
|
+
|
|
|
+// // 缓存结果
|
|
|
+// SimpleCacheManager::instance().cacheThumbnail(hwnd, pixmap);
|
|
|
+// }
|
|
|
+
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// // DWM缩略图捕获方法
|
|
|
+// QPixmap SimpleWindowFinder::captureDWMThumbnail(HWND hwnd, int width, int height)
|
|
|
+// {
|
|
|
+// // 检查是否支持DWM
|
|
|
+// BOOL dwmEnabled = FALSE;
|
|
|
+// if (FAILED(DwmIsCompositionEnabled(&dwmEnabled)) || !dwmEnabled) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// // 创建临时窗口用于DWM缩略图
|
|
|
+// HWND tempWindow = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED,
|
|
|
+// L"STATIC", L"TempThumbnail",
|
|
|
+// WS_POPUP,
|
|
|
+// -32000, -32000, width, height,
|
|
|
+// NULL, NULL, GetModuleHandle(NULL), NULL);
|
|
|
+
|
|
|
+// if (!tempWindow) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// HTHUMBNAIL thumbnail = NULL;
|
|
|
+// HRESULT hr = DwmRegisterThumbnail(tempWindow, hwnd, &thumbnail);
|
|
|
+
|
|
|
+// QPixmap result;
|
|
|
+// if (SUCCEEDED(hr) && thumbnail) {
|
|
|
+// // 设置缩略图属性
|
|
|
+// DWM_THUMBNAIL_PROPERTIES props = {0};
|
|
|
+// props.dwFlags = DWM_TNP_RECTDESTINATION | DWM_TNP_RECTSOURCE | DWM_TNP_OPACITY | DWM_TNP_VISIBLE;
|
|
|
+// props.rcDestination = {0, 0, width, height};
|
|
|
+
|
|
|
+// // 获取源窗口大小
|
|
|
+// RECT sourceRect;
|
|
|
+// GetWindowRect(hwnd, &sourceRect);
|
|
|
+// props.rcSource = {0, 0, sourceRect.right - sourceRect.left, sourceRect.bottom - sourceRect.top};
|
|
|
+// props.opacity = 255;
|
|
|
+// props.fVisible = TRUE;
|
|
|
+
|
|
|
+// hr = DwmUpdateThumbnailProperties(thumbnail, &props);
|
|
|
+
|
|
|
+// if (SUCCEEDED(hr)) {
|
|
|
+// // 显示临时窗口并截图
|
|
|
+// ShowWindow(tempWindow, SW_SHOW);
|
|
|
+// UpdateWindow(tempWindow);
|
|
|
+
|
|
|
+// // 等待一小段时间让缩略图渲染
|
|
|
+// Sleep(50);
|
|
|
+
|
|
|
+// // 截取临时窗口
|
|
|
+// HDC hdcWindow = GetDC(tempWindow);
|
|
|
+// HDC hdcMemDC = CreateCompatibleDC(hdcWindow);
|
|
|
+// HBITMAP hbmScreen = CreateCompatibleBitmap(hdcWindow, width, height);
|
|
|
+// HGDIOBJ oldBitmap = SelectObject(hdcMemDC, hbmScreen);
|
|
|
+
|
|
|
+// BitBlt(hdcMemDC, 0, 0, width, height, hdcWindow, 0, 0, SRCCOPY);
|
|
|
+
|
|
|
+// result = convertBitmapToPixmap(hbmScreen, width, height);
|
|
|
+
|
|
|
+// // 清理资源
|
|
|
+// SelectObject(hdcMemDC, oldBitmap);
|
|
|
+// DeleteObject(hbmScreen);
|
|
|
+// DeleteDC(hdcMemDC);
|
|
|
+// ReleaseDC(tempWindow, hdcWindow);
|
|
|
+// }
|
|
|
+
|
|
|
+// DwmUnregisterThumbnail(thumbnail);
|
|
|
+// }
|
|
|
+
|
|
|
+// DestroyWindow(tempWindow);
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+// // PrintWindow捕获方法
|
|
|
+// QPixmap SimpleWindowFinder::capturePrintWindow(HWND hwnd, int width, int height)
|
|
|
+// {
|
|
|
+// HDC hdcWindow = GetDC(hwnd);
|
|
|
+// HDC hdcMemDC = CreateCompatibleDC(hdcWindow);
|
|
|
+// HBITMAP hbmScreen = CreateCompatibleBitmap(hdcWindow, width, height);
|
|
|
+// HGDIOBJ oldBitmap = SelectObject(hdcMemDC, hbmScreen);
|
|
|
+
|
|
|
+// QPixmap result;
|
|
|
+
|
|
|
+// // 尝试不同的PrintWindow标志
|
|
|
+// UINT flags[] = {
|
|
|
+// PW_RENDERFULLCONTENT,
|
|
|
+// PW_CLIENTONLY,
|
|
|
+// 0 // 默认标志
|
|
|
+// };
|
|
|
+
|
|
|
+// for (int i = 0; i < 3; i++) {
|
|
|
+// if (PrintWindow(hwnd, hdcMemDC, flags[i])) {
|
|
|
+// result = convertBitmapToPixmap(hbmScreen, width, height);
|
|
|
+// if (!result.isNull()) {
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 清理资源
|
|
|
+// SelectObject(hdcMemDC, oldBitmap);
|
|
|
+// DeleteObject(hbmScreen);
|
|
|
+// DeleteDC(hdcMemDC);
|
|
|
+// ReleaseDC(hwnd, hdcWindow);
|
|
|
+
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 屏幕截图方法
|
|
|
+// QPixmap SimpleWindowFinder::captureScreenshot(HWND hwnd, const RECT& rect)
|
|
|
+// {
|
|
|
+// int width = rect.right - rect.left;
|
|
|
+// int height = rect.bottom - rect.top;
|
|
|
+
|
|
|
+// HDC hdcScreen = GetDC(NULL);
|
|
|
+// HDC hdcMemDC = CreateCompatibleDC(hdcScreen);
|
|
|
+// HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, width, height);
|
|
|
+// HGDIOBJ oldBitmap = SelectObject(hdcMemDC, hbmScreen);
|
|
|
+
|
|
|
+// // 使用BitBlt从屏幕复制
|
|
|
+// BOOL result = BitBlt(hdcMemDC, 0, 0, width, height, hdcScreen, rect.left, rect.top, SRCCOPY);
|
|
|
+
|
|
|
+// QPixmap pixmap;
|
|
|
+// if (result) {
|
|
|
+// pixmap = convertBitmapToPixmap(hbmScreen, width, height);
|
|
|
+// }
|
|
|
+
|
|
|
+// // 清理资源
|
|
|
+// SelectObject(hdcMemDC, oldBitmap);
|
|
|
+// DeleteObject(hbmScreen);
|
|
|
+// DeleteDC(hdcMemDC);
|
|
|
+// ReleaseDC(NULL, hdcScreen);
|
|
|
+
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 位图转换为QPixmap的辅助方法
|
|
|
+// QPixmap SimpleWindowFinder::convertBitmapToPixmap(HBITMAP hBitmap, int width, int height)
|
|
|
+// {
|
|
|
+// if (!hBitmap || width <= 0 || height <= 0) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// // 手动转换HBITMAP到QPixmap (Qt5兼容)
|
|
|
+// HDC hdc = CreateCompatibleDC(NULL);
|
|
|
+// if (!hdc) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// BITMAPINFO bmi = {0};
|
|
|
+// bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
+// bmi.bmiHeader.biWidth = width;
|
|
|
+// bmi.bmiHeader.biHeight = -height; // 负值表示自上而下
|
|
|
+// bmi.bmiHeader.biPlanes = 1;
|
|
|
+// bmi.bmiHeader.biBitCount = 32;
|
|
|
+// bmi.bmiHeader.biCompression = BI_RGB;
|
|
|
+
|
|
|
+// // 分配内存
|
|
|
+// int dataSize = width * height * 4;
|
|
|
+// uchar* data = new uchar[dataSize];
|
|
|
+
|
|
|
+// QPixmap pixmap;
|
|
|
+
|
|
|
+// if (GetDIBits(hdc, hBitmap, 0, height, data, &bmi, DIB_RGB_COLORS)) {
|
|
|
+// // 创建QImage并转换为QPixmap
|
|
|
+// QImage image(data, width, height, QImage::Format_RGB32);
|
|
|
+// pixmap = QPixmap::fromImage(image);
|
|
|
+// qDebug() << "Successfully converted HBITMAP to QPixmap, size:" << width << "x" << height;
|
|
|
+// } else {
|
|
|
+// qDebug() << "Failed to get DIB bits from HBITMAP";
|
|
|
+// }
|
|
|
+
|
|
|
+// delete[] data;
|
|
|
+// DeleteDC(hdc);
|
|
|
+
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap SimpleWindowFinder::captureDesktop(const QSize& size)
|
|
|
+// {
|
|
|
+// // 获取主屏幕
|
|
|
+// QScreen* screen = QApplication::primaryScreen();
|
|
|
+// if (!screen) {
|
|
|
+// return QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap pixmap = screen->grabWindow(0);
|
|
|
+
|
|
|
+// if (!pixmap.isNull() && !size.isEmpty()) {
|
|
|
+// pixmap = pixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
|
|
+// }
|
|
|
+
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// QIcon SimpleWindowFinder::getWindowIcon(HWND hwnd)
|
|
|
+// {
|
|
|
+// // 尝试多种方式获取图标
|
|
|
+// HICON hIcon = nullptr;
|
|
|
+
|
|
|
+// // 方法1: 发送消息获取大图标
|
|
|
+// hIcon = reinterpret_cast<HICON>(SendMessage(hwnd, WM_GETICON, ICON_BIG, 0));
|
|
|
+// if (!hIcon) {
|
|
|
+// // 方法2: 发送消息获取小图标
|
|
|
+// hIcon = reinterpret_cast<HICON>(SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0));
|
|
|
+// }
|
|
|
+// if (!hIcon) {
|
|
|
+// // 方法3: 从窗口类获取图标
|
|
|
+// hIcon = reinterpret_cast<HICON>(GetClassLongPtr(hwnd, GCLP_HICON));
|
|
|
+// }
|
|
|
+// if (!hIcon) {
|
|
|
+// // 方法4: 从窗口类获取小图标
|
|
|
+// hIcon = reinterpret_cast<HICON>(GetClassLongPtr(hwnd, GCLP_HICONSM));
|
|
|
+// }
|
|
|
+
|
|
|
+// if (hIcon) {
|
|
|
+// // Qt5兼容的HICON转换
|
|
|
+// QPixmap pixmap;
|
|
|
+// ICONINFO iconInfo;
|
|
|
+// if (GetIconInfo(hIcon, &iconInfo)) {
|
|
|
+// // 获取位图信息
|
|
|
+// BITMAP bmp;
|
|
|
+// if (GetObject(iconInfo.hbmColor, sizeof(BITMAP), &bmp)) {
|
|
|
+// // 创建设备上下文
|
|
|
+// HDC hdc = CreateCompatibleDC(NULL);
|
|
|
+// if (hdc) {
|
|
|
+// // 准备位图信息头
|
|
|
+// BITMAPINFOHEADER bih = {0};
|
|
|
+// bih.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
+// bih.biWidth = bmp.bmWidth;
|
|
|
+// bih.biHeight = -bmp.bmHeight;
|
|
|
+// bih.biPlanes = 1;
|
|
|
+// bih.biBitCount = 32;
|
|
|
+// bih.biCompression = BI_RGB;
|
|
|
+
|
|
|
+// // 分配内存
|
|
|
+// int dataSize = bmp.bmWidth * bmp.bmHeight * 4;
|
|
|
+// uchar* data = new uchar[dataSize];
|
|
|
+
|
|
|
+// // 获取位图数据
|
|
|
+// BITMAPINFO bi = {0};
|
|
|
+// bi.bmiHeader = bih;
|
|
|
+
|
|
|
+// if (GetDIBits(hdc, iconInfo.hbmColor, 0, bmp.bmHeight, data, &bi, DIB_RGB_COLORS)) {
|
|
|
+// // 创建QImage
|
|
|
+// QImage image(data, bmp.bmWidth, bmp.bmHeight, QImage::Format_ARGB32);
|
|
|
+// pixmap = QPixmap::fromImage(image.rgbSwapped());
|
|
|
+// }
|
|
|
+
|
|
|
+// delete[] data;
|
|
|
+// DeleteDC(hdc);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 清理资源
|
|
|
+// if (iconInfo.hbmColor) DeleteObject(iconInfo.hbmColor);
|
|
|
+// if (iconInfo.hbmMask) DeleteObject(iconInfo.hbmMask);
|
|
|
+// }
|
|
|
+
|
|
|
+// if (!pixmap.isNull()) {
|
|
|
+// return QIcon(pixmap);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 使用默认图标
|
|
|
+// return QApplication::style()->standardIcon(QStyle::SP_ComputerIcon);
|
|
|
+// }
|
|
|
+
|
|
|
+// QString SimpleWindowFinder::getWindowTitle(HWND hwnd)
|
|
|
+// {
|
|
|
+// wchar_t title[256];
|
|
|
+// int length = GetWindowTextW(hwnd, title, 256);
|
|
|
+// if (length > 0) {
|
|
|
+// return QString::fromWCharArray(title, length);
|
|
|
+// }
|
|
|
+// return QString();
|
|
|
+// }
|
|
|
+
|
|
|
+// QString SimpleWindowFinder::getProcessName(HWND hwnd)
|
|
|
+// {
|
|
|
+// DWORD processId;
|
|
|
+// GetWindowThreadProcessId(hwnd, &processId);
|
|
|
+
|
|
|
+// HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId);
|
|
|
+// if (!hProcess) {
|
|
|
+// return QString();
|
|
|
+// }
|
|
|
+
|
|
|
+// wchar_t processName[MAX_PATH];
|
|
|
+// DWORD size = MAX_PATH;
|
|
|
+// if (QueryFullProcessImageNameW(hProcess, 0, processName, &size)) {
|
|
|
+// CloseHandle(hProcess);
|
|
|
+// QString fullPath = QString::fromWCharArray(processName);
|
|
|
+// return QFileInfo(fullPath).baseName();
|
|
|
+// }
|
|
|
+
|
|
|
+// CloseHandle(hProcess);
|
|
|
+// return QString();
|
|
|
+// }
|
|
|
+
|
|
|
+// bool SimpleWindowFinder::isValidWindow(HWND hwnd)
|
|
|
+// {
|
|
|
+// if (!IsWindow(hwnd) || !IsWindowVisible(hwnd)) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 过滤掉没有标题的窗口
|
|
|
+// wchar_t title[256];
|
|
|
+// if (GetWindowTextW(hwnd, title, 256) == 0) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 过滤掉工具窗口
|
|
|
+// LONG exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
|
|
|
+// if (exStyle & WS_EX_TOOLWINDOW) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 检查窗口是否有父窗口(排除子窗口)
|
|
|
+// if (GetParent(hwnd) != NULL) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 更严格的顶层窗口检查:必须是应用程序主窗口
|
|
|
+// LONG style = GetWindowLong(hwnd, GWL_STYLE);
|
|
|
+
|
|
|
+// // 检查是否是顶层窗口(必须有标题栏或是弹出窗口)
|
|
|
+// if (!(style & WS_CAPTION) && !(style & WS_POPUP)) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 排除子窗口:检查WS_CHILD样式
|
|
|
+// if (style & WS_CHILD) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 检查窗口是否在Alt+Tab列表中(更严格的检查)
|
|
|
+// HWND owner = GetWindow(hwnd, GW_OWNER);
|
|
|
+// if (owner != NULL) {
|
|
|
+// // 如果有所有者窗口且所有者可见,则不显示
|
|
|
+// if (IsWindowVisible(owner)) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// // 检查所有者是否是桌面窗口
|
|
|
+// HWND desktop = GetDesktopWindow();
|
|
|
+// if (owner != desktop) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 确保是应用程序窗口:检查窗口是否有应用程序图标
|
|
|
+// HICON icon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
|
|
|
+// if (!icon) {
|
|
|
+// icon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0);
|
|
|
+// }
|
|
|
+// if (!icon) {
|
|
|
+// icon = (HICON)GetClassLongPtr(hwnd, GCLP_HICON);
|
|
|
+// }
|
|
|
+// // 如果没有图标,可能不是应用程序主窗口
|
|
|
+// if (!icon) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 过滤掉一些系统窗口类名
|
|
|
+// wchar_t className[256];
|
|
|
+// if (GetClassNameW(hwnd, className, 256) > 0) {
|
|
|
+// std::wstring classStr(className);
|
|
|
+// if (classStr == L"Shell_TrayWnd" || // 任务栏
|
|
|
+// classStr == L"DV2ControlHost" || // 桌面窗口
|
|
|
+// classStr == L"MsgrIMEWindowClass" || // 输入法窗口
|
|
|
+// classStr == L"SysShadow" || // 阴影窗口
|
|
|
+// classStr.find(L"IME") != std::wstring::npos) { // 输入法相关窗口
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleDesktopPreview Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleDesktopPreview::SimpleDesktopPreview(QWidget* parent)
|
|
|
+// : QLabel(parent)
|
|
|
+// , m_updateTimer(new QTimer(this))
|
|
|
+// , m_previewSize(240, 180) // 程序预览的2倍 (120x90 * 2)
|
|
|
+// , m_isActive(false)
|
|
|
+// {
|
|
|
+// setMinimumSize(m_previewSize);
|
|
|
+// setScaledContents(false); // 不拉伸内容,保持1:1比例
|
|
|
+// setAlignment(Qt::AlignCenter); // 居中显示
|
|
|
+// setStyleSheet(
|
|
|
+// "QLabel { "
|
|
|
+// " border: 2px solid #3498db; "
|
|
|
+// " border-radius: 5px; "
|
|
|
+// " background-color: #ecf0f1; "
|
|
|
+// "}"
|
|
|
+// );
|
|
|
+// setCursor(Qt::PointingHandCursor);
|
|
|
+
|
|
|
+// connect(m_updateTimer, &QTimer::timeout, this, &SimpleDesktopPreview::updateDesktop);
|
|
|
+
|
|
|
+// setText("点击开始桌面预览");
|
|
|
+// setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleDesktopPreview::~SimpleDesktopPreview()
|
|
|
+// {
|
|
|
+// stopPreview();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::startPreview()
|
|
|
+// {
|
|
|
+// if (m_isActive) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Starting desktop preview";
|
|
|
+// m_isActive = true;
|
|
|
+// m_updateTimer->start(1000); // 1秒更新一次
|
|
|
+// updateDesktop();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::stopPreview()
|
|
|
+// {
|
|
|
+// if (!m_isActive) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Stopping desktop preview";
|
|
|
+// m_isActive = false;
|
|
|
+// m_updateTimer->stop();
|
|
|
+// setText("桌面预览已停止");
|
|
|
+// setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::setUpdateInterval(int ms)
|
|
|
+// {
|
|
|
+// if (m_updateTimer->isActive()) {
|
|
|
+// m_updateTimer->setInterval(ms);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::updateDesktop()
|
|
|
+// {
|
|
|
+// if (!m_isActive) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap desktop = SimpleWindowFinder::captureDesktop(m_previewSize);
|
|
|
+// if (!desktop.isNull()) {
|
|
|
+// setPixmap(desktop);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::mousePressEvent(QMouseEvent* event)
|
|
|
+// {
|
|
|
+// if (event->button() == Qt::LeftButton) {
|
|
|
+// emit clicked();
|
|
|
+// }
|
|
|
+// QLabel::mousePressEvent(event);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleDesktopPreview::paintEvent(QPaintEvent* event)
|
|
|
+// {
|
|
|
+// QLabel::paintEvent(event);
|
|
|
+
|
|
|
+// if (m_isActive) {
|
|
|
+// QPainter painter(this);
|
|
|
+// painter.setRenderHint(QPainter::Antialiasing);
|
|
|
+
|
|
|
+// // 绘制录制指示器
|
|
|
+// painter.setPen(QPen(Qt::red, 2));
|
|
|
+// painter.setBrush(Qt::red);
|
|
|
+// painter.drawEllipse(width() - 20, 10, 10, 10);
|
|
|
+
|
|
|
+// painter.setPen(Qt::white);
|
|
|
+// painter.drawText(width() - 60, 25, "LIVE");
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleWindowList Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleWindowList::SimpleWindowList(QWidget* parent)
|
|
|
+// : QScrollArea(parent)
|
|
|
+// , m_contentWidget(new QWidget)
|
|
|
+// , m_layout(new QGridLayout(m_contentWidget))
|
|
|
+// , m_thumbnailSize(120, 90)
|
|
|
+// , m_showMinimized(true)
|
|
|
+// , m_columnsCount(6)
|
|
|
+// {
|
|
|
+// setWidget(m_contentWidget);
|
|
|
+// setWidgetResizable(true);
|
|
|
+// setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
|
|
+// setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
|
|
+
|
|
|
+// m_layout->setSpacing(5);
|
|
|
+// m_layout->setContentsMargins(5, 5, 5, 5);
|
|
|
+
|
|
|
+// setStyleSheet(
|
|
|
+// "QScrollArea { "
|
|
|
+// " background-color: #f8f9fa; "
|
|
|
+// " border: 1px solid #bdc3c7; "
|
|
|
+// " border-radius: 3px; "
|
|
|
+// "}"
|
|
|
+// "QWidget { background-color: transparent; }"
|
|
|
+// );
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleWindowList::~SimpleWindowList()
|
|
|
+// {
|
|
|
+// clearLayout();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::setThumbnailSize(const QSize& size)
|
|
|
+// {
|
|
|
+// if (m_thumbnailSize != size) {
|
|
|
+// m_thumbnailSize = size;
|
|
|
+// refreshWindowList();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::setShowMinimized(bool show)
|
|
|
+// {
|
|
|
+// if (m_showMinimized != show) {
|
|
|
+// m_showMinimized = show;
|
|
|
+// refreshWindowList();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// QWidget* SimpleWindowList::createDesktopPreviewItem()
|
|
|
+// {
|
|
|
+// auto* widget = new QWidget;
|
|
|
+// widget->setFixedSize(m_thumbnailSize + QSize(10, 30));
|
|
|
+// widget->setCursor(Qt::PointingHandCursor);
|
|
|
+
|
|
|
+// auto* layout = new QVBoxLayout(widget);
|
|
|
+// layout->setContentsMargins(2, 2, 2, 2);
|
|
|
+// layout->setSpacing(2);
|
|
|
+
|
|
|
+// // 桌面缩略图
|
|
|
+// auto* thumbnailLabel = new QLabel;
|
|
|
+// thumbnailLabel->setFixedSize(m_thumbnailSize);
|
|
|
+// thumbnailLabel->setScaledContents(false);
|
|
|
+// thumbnailLabel->setAlignment(Qt::AlignCenter);
|
|
|
+// thumbnailLabel->setStyleSheet(
|
|
|
+// "QLabel { "
|
|
|
+// " border: 2px solid #3498db; "
|
|
|
+// " border-radius: 3px; "
|
|
|
+// " background-color: #ecf0f1; "
|
|
|
+// "}"
|
|
|
+// );
|
|
|
+
|
|
|
+// // 获取桌面缩略图
|
|
|
+// QPixmap desktop = SimpleWindowFinder::captureDesktop(m_thumbnailSize);
|
|
|
+// if (!desktop.isNull()) {
|
|
|
+// thumbnailLabel->setPixmap(desktop);
|
|
|
+// } else {
|
|
|
+// thumbnailLabel->setText("桌面");
|
|
|
+// thumbnailLabel->setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// layout->addWidget(thumbnailLabel);
|
|
|
+
|
|
|
+// // 标题
|
|
|
+// auto* titleLabel = new QLabel("桌面预览");
|
|
|
+// titleLabel->setAlignment(Qt::AlignCenter);
|
|
|
+// titleLabel->setWordWrap(true);
|
|
|
+// titleLabel->setMaximumHeight(20);
|
|
|
+// titleLabel->setStyleSheet("font-size: 10px; color: #2c3e50; font-weight: bold;");
|
|
|
+
|
|
|
+// layout->addWidget(titleLabel);
|
|
|
+
|
|
|
+// // 标记为桌面预览项
|
|
|
+// widget->setProperty("isDesktop", true);
|
|
|
+
|
|
|
+// // 连接点击事件
|
|
|
+// widget->installEventFilter(this);
|
|
|
+
|
|
|
+// return widget;
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::refreshWindowList()
|
|
|
+// {
|
|
|
+// qDebug() << "Refreshing window list...";
|
|
|
+
|
|
|
+// auto newWindows = SimpleWindowFinder::getWindowList(m_showMinimized);
|
|
|
+
|
|
|
+// // 检查是否有变化
|
|
|
+// bool hasChanges = (newWindows.size() != m_windows.size());
|
|
|
+// if (!hasChanges) {
|
|
|
+// for (int i = 0; i < newWindows.size(); ++i) {
|
|
|
+// if (newWindows[i].hwnd != m_windows[i].hwnd) {
|
|
|
+// hasChanges = true;
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// if (hasChanges) {
|
|
|
+// m_windows = newWindows;
|
|
|
+// updateLayout();
|
|
|
+// qDebug() << "Window list updated:" << m_windows.size() << "windows";
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::updateLayout()
|
|
|
+// {
|
|
|
+// clearLayout();
|
|
|
+
|
|
|
+// // 计算列数
|
|
|
+// int availableWidth = viewport()->width() - 20;
|
|
|
+// m_columnsCount = qMax(1, availableWidth / (m_thumbnailSize.width() + 10));
|
|
|
+
|
|
|
+// int row = 0, col = 0;
|
|
|
+
|
|
|
+// // 首先添加桌面预览项
|
|
|
+// auto* desktopItem = createDesktopPreviewItem();
|
|
|
+// if (desktopItem) {
|
|
|
+// m_layout->addWidget(desktopItem, row, col);
|
|
|
+// col++;
|
|
|
+// if (col >= m_columnsCount) {
|
|
|
+// col = 0;
|
|
|
+// row++;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 然后添加窗口项
|
|
|
+// for (const auto& window : m_windows) {
|
|
|
+// auto* item = createWindowItem(window);
|
|
|
+// if (item) {
|
|
|
+// m_layout->addWidget(item, row, col);
|
|
|
+
|
|
|
+// col++;
|
|
|
+// if (col >= m_columnsCount) {
|
|
|
+// col = 0;
|
|
|
+// row++;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // 添加弹性空间
|
|
|
+// m_layout->setRowStretch(row + 1, 1);
|
|
|
+// m_layout->setColumnStretch(m_columnsCount, 1);
|
|
|
+// }
|
|
|
+
|
|
|
+// QWidget* SimpleWindowList::createWindowItem(const SimpleWindowInfo& info)
|
|
|
+// {
|
|
|
+// auto* widget = new QWidget;
|
|
|
+// widget->setFixedSize(m_thumbnailSize + QSize(10, 30));
|
|
|
+// widget->setCursor(Qt::PointingHandCursor);
|
|
|
+
|
|
|
+// auto* layout = new QVBoxLayout(widget);
|
|
|
+// layout->setContentsMargins(2, 2, 2, 2);
|
|
|
+// layout->setSpacing(2);
|
|
|
+
|
|
|
+// // 缩略图
|
|
|
+// auto* thumbnailLabel = new QLabel;
|
|
|
+// thumbnailLabel->setFixedSize(m_thumbnailSize);
|
|
|
+// thumbnailLabel->setScaledContents(false); // 不拉伸内容,保持原比例
|
|
|
+// thumbnailLabel->setAlignment(Qt::AlignCenter); // 居中显示
|
|
|
+// thumbnailLabel->setStyleSheet(
|
|
|
+// "QLabel { "
|
|
|
+// " border: 1px solid #bdc3c7; "
|
|
|
+// " border-radius: 3px; "
|
|
|
+// " background-color: #ecf0f1; "
|
|
|
+// "}"
|
|
|
+// );
|
|
|
+
|
|
|
+// // 获取缩略图
|
|
|
+// QPixmap thumbnail = SimpleWindowFinder::captureWindow(info.hwnd, m_thumbnailSize);
|
|
|
+// if (!thumbnail.isNull()) {
|
|
|
+// thumbnailLabel->setPixmap(thumbnail);
|
|
|
+// } else {
|
|
|
+// // 使用图标作为占位符
|
|
|
+// QPixmap iconPixmap = info.icon.pixmap(64, 64);
|
|
|
+// thumbnailLabel->setPixmap(iconPixmap);
|
|
|
+// }
|
|
|
+
|
|
|
+// layout->addWidget(thumbnailLabel);
|
|
|
+
|
|
|
+// // 标题
|
|
|
+// auto* titleLabel = new QLabel(info.title);
|
|
|
+// titleLabel->setAlignment(Qt::AlignCenter);
|
|
|
+// titleLabel->setWordWrap(true);
|
|
|
+// titleLabel->setMaximumHeight(20);
|
|
|
+// titleLabel->setStyleSheet("font-size: 10px; color: #2c3e50;");
|
|
|
+
|
|
|
+// // 截断过长的标题
|
|
|
+// QString displayTitle = info.title;
|
|
|
+// if (displayTitle.length() > 20) {
|
|
|
+// displayTitle = displayTitle.left(17) + "...";
|
|
|
+// }
|
|
|
+// titleLabel->setText(displayTitle);
|
|
|
+// titleLabel->setToolTip(info.title);
|
|
|
+
|
|
|
+// layout->addWidget(titleLabel);
|
|
|
+
|
|
|
+// // 存储窗口句柄
|
|
|
+// widget->setProperty("hwnd", reinterpret_cast<qintptr>(info.hwnd));
|
|
|
+
|
|
|
+// // 连接点击事件
|
|
|
+// widget->installEventFilter(this);
|
|
|
+
|
|
|
+// // 最小化窗口的视觉提示
|
|
|
+// if (info.isMinimized) {
|
|
|
+// widget->setStyleSheet("QWidget { opacity: 0.7; }");
|
|
|
+// }
|
|
|
+
|
|
|
+// return widget;
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::clearLayout()
|
|
|
+// {
|
|
|
+// while (QLayoutItem* item = m_layout->takeAt(0)) {
|
|
|
+// if (QWidget* widget = item->widget()) {
|
|
|
+// widget->deleteLater();
|
|
|
+// }
|
|
|
+// delete item;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowList::resizeEvent(QResizeEvent* event)
|
|
|
+// {
|
|
|
+// QScrollArea::resizeEvent(event);
|
|
|
+// QTimer::singleShot(100, this, &SimpleWindowList::updateLayout);
|
|
|
+// }
|
|
|
+
|
|
|
+// bool SimpleWindowList::eventFilter(QObject* obj, QEvent* event)
|
|
|
+// {
|
|
|
+// if (auto* widget = qobject_cast<QWidget*>(obj)) {
|
|
|
+// // 检查是否是桌面预览项
|
|
|
+// bool isDesktop = widget->property("isDesktop").toBool();
|
|
|
+
|
|
|
+// if (event->type() == QEvent::MouseButtonPress) {
|
|
|
+// auto* mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
+// if (mouseEvent->button() == Qt::LeftButton) {
|
|
|
+// if (isDesktop) {
|
|
|
+// emit desktopClicked();
|
|
|
+// return true;
|
|
|
+// } else {
|
|
|
+// QVariant hwndVariant = widget->property("hwnd");
|
|
|
+// if (hwndVariant.isValid()) {
|
|
|
+// HWND hwnd = reinterpret_cast<HWND>(hwndVariant.value<qintptr>());
|
|
|
+// if (hwnd) {
|
|
|
+// // 查找窗口标题
|
|
|
+// QString title;
|
|
|
+// for (const auto& window : m_windows) {
|
|
|
+// if (window.hwnd == hwnd) {
|
|
|
+// title = window.title;
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// emit windowSelected(hwnd, title);
|
|
|
+// return true;
|
|
|
+// } else {
|
|
|
+// qDebug() << "Invalid hwnd in click event";
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// qDebug() << "No hwnd property found in click event";
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// } else if (event->type() == QEvent::MouseButtonDblClick) {
|
|
|
+// if (!isDesktop) {
|
|
|
+// QVariant hwndVariant = widget->property("hwnd");
|
|
|
+// if (hwndVariant.isValid()) {
|
|
|
+// HWND hwnd = reinterpret_cast<HWND>(hwndVariant.value<qintptr>());
|
|
|
+// if (hwnd) {
|
|
|
+// emit windowDoubleClicked(hwnd);
|
|
|
+// return true;
|
|
|
+// } else {
|
|
|
+// qDebug() << "Invalid hwnd in double click event";
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// qDebug() << "No hwnd property found in double click event";
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// return QScrollArea::eventFilter(obj, event);
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleWindowPreview Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleWindowPreview::SimpleWindowPreview(QWidget* parent)
|
|
|
+// : QLabel(parent)
|
|
|
+// , m_updateTimer(new QTimer(this))
|
|
|
+// , m_stateTimer(new QTimer(this))
|
|
|
+// , m_targetHwnd(nullptr)
|
|
|
+// , m_isActive(false)
|
|
|
+// , m_isWindowMinimized(false)
|
|
|
+// {
|
|
|
+// setMinimumSize(400, 300);
|
|
|
+// setScaledContents(true);
|
|
|
+// setStyleSheet(
|
|
|
+// "QLabel { "
|
|
|
+// " border: 2px solid #e74c3c; "
|
|
|
+// " border-radius: 5px; "
|
|
|
+// " background-color: #ecf0f1; "
|
|
|
+// "}"
|
|
|
+// );
|
|
|
+
|
|
|
+// connect(m_updateTimer, &QTimer::timeout, this, &SimpleWindowPreview::updatePreview);
|
|
|
+// connect(m_stateTimer, &QTimer::timeout, this, &SimpleWindowPreview::checkWindowState);
|
|
|
+
|
|
|
+// setText("请选择要预览的窗口");
|
|
|
+// setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleWindowPreview::~SimpleWindowPreview()
|
|
|
+// {
|
|
|
+// stopPreview();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::setTargetWindow(HWND hwnd, const QString& title)
|
|
|
+// {
|
|
|
+// if (m_targetHwnd == hwnd) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// stopPreview();
|
|
|
+// m_targetHwnd = hwnd;
|
|
|
+// m_windowTitle = title;
|
|
|
+
|
|
|
+// if (hwnd && IsWindow(hwnd)) {
|
|
|
+// setText(QString("准备预览: %1").arg(m_windowTitle));
|
|
|
+// } else {
|
|
|
+// setText("请选择要预览的窗口");
|
|
|
+// }
|
|
|
+// setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::startPreview()
|
|
|
+// {
|
|
|
+// if (!m_targetHwnd || !IsWindow(m_targetHwnd) || m_isActive) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Starting window preview for" << m_windowTitle;
|
|
|
+
|
|
|
+// m_isActive = true;
|
|
|
+// m_isWindowMinimized = IsIconic(m_targetHwnd);
|
|
|
+
|
|
|
+// m_updateTimer->start(500); // 0.5秒更新一次
|
|
|
+// m_stateTimer->start(1000); // 每秒检查窗口状态
|
|
|
+
|
|
|
+// updatePreview();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::stopPreview()
|
|
|
+// {
|
|
|
+// if (!m_isActive) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Stopping window preview";
|
|
|
+
|
|
|
+// m_updateTimer->stop();
|
|
|
+// m_stateTimer->stop();
|
|
|
+// m_isActive = false;
|
|
|
+
|
|
|
+// if (!m_windowTitle.isEmpty()) {
|
|
|
+// setText(QString("预览已停止: %1").arg(m_windowTitle));
|
|
|
+// } else {
|
|
|
+// setText("请选择要预览的窗口");
|
|
|
+// }
|
|
|
+// setAlignment(Qt::AlignCenter);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::setUpdateInterval(int ms)
|
|
|
+// {
|
|
|
+// if (m_updateTimer->isActive()) {
|
|
|
+// m_updateTimer->setInterval(ms);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::updatePreview()
|
|
|
+// {
|
|
|
+// if (!m_isActive || !m_targetHwnd || !IsWindow(m_targetHwnd)) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap frame = SimpleWindowFinder::captureWindow(m_targetHwnd, size());
|
|
|
+// if (!frame.isNull()) {
|
|
|
+// // 如果窗口未最小化,保存最后一帧
|
|
|
+// if (!m_isWindowMinimized) {
|
|
|
+// m_lastFrame = frame;
|
|
|
+// }
|
|
|
+// setPixmap(frame);
|
|
|
+// } else if (m_isWindowMinimized && !m_lastFrame.isNull()) {
|
|
|
+// // 显示最后一帧
|
|
|
+// setPixmap(m_lastFrame);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::checkWindowState()
|
|
|
+// {
|
|
|
+// if (!m_targetHwnd || !IsWindow(m_targetHwnd)) {
|
|
|
+// stopPreview();
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// bool isMinimized = IsIconic(m_targetHwnd);
|
|
|
+// if (isMinimized != m_isWindowMinimized) {
|
|
|
+// m_isWindowMinimized = isMinimized;
|
|
|
+
|
|
|
+// if (isMinimized) {
|
|
|
+// qDebug() << "Window minimized:" << m_windowTitle;
|
|
|
+// } else {
|
|
|
+// qDebug() << "Window restored:" << m_windowTitle;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleWindowPreview::paintEvent(QPaintEvent* event)
|
|
|
+// {
|
|
|
+// QLabel::paintEvent(event);
|
|
|
+
|
|
|
+// if (!m_windowTitle.isEmpty()) {
|
|
|
+// QPainter painter(this);
|
|
|
+// painter.setRenderHint(QPainter::Antialiasing);
|
|
|
+
|
|
|
+// // 绘制窗口标题
|
|
|
+// painter.setPen(Qt::white);
|
|
|
+// painter.drawText(10, height() - 10, m_windowTitle);
|
|
|
+
|
|
|
+// // 绘制状态指示器
|
|
|
+// if (m_isActive) {
|
|
|
+// painter.setPen(QPen(Qt::green, 2));
|
|
|
+// painter.setBrush(Qt::green);
|
|
|
+// painter.drawEllipse(width() - 20, 10, 10, 10);
|
|
|
+// }
|
|
|
+
|
|
|
+// if (m_isWindowMinimized) {
|
|
|
+// painter.setPen(Qt::yellow);
|
|
|
+// painter.drawText(width() - 100, 25, "MINIMIZED");
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleScreenWall Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleScreenWall::SimpleScreenWall(QWidget* parent)
|
|
|
+// : QWidget(parent)
|
|
|
+// , m_mainLayout(nullptr)
|
|
|
+// , m_desktopPreview(nullptr)
|
|
|
+// , m_windowList(nullptr)
|
|
|
+
|
|
|
+// , m_isRunning(false)
|
|
|
+// , m_selectedWindow(nullptr)
|
|
|
+// , m_refreshTimer(new QTimer(this))
|
|
|
+// {
|
|
|
+// setupUI();
|
|
|
+// setupConnections();
|
|
|
+
|
|
|
+// setMinimumSize(800, 600);
|
|
|
+// resize(1200, 900);
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleScreenWall::~SimpleScreenWall()
|
|
|
+// {
|
|
|
+// stopScreenWall();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::setupUI()
|
|
|
+// {
|
|
|
+// m_mainLayout = new QVBoxLayout(this);
|
|
|
+// m_mainLayout->setContentsMargins(5, 5, 5, 5);
|
|
|
+// m_mainLayout->setSpacing(5);
|
|
|
+
|
|
|
+// // 统一的预览区域,包含桌面和程序预览
|
|
|
+// m_windowList = new SimpleWindowList(this);
|
|
|
+// m_mainLayout->addWidget(m_windowList, 1);
|
|
|
+
|
|
|
+// // 移除单独的桌面预览和窗口预览组件
|
|
|
+// m_desktopPreview = nullptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::setupConnections()
|
|
|
+// {
|
|
|
+// connect(m_windowList, &SimpleWindowList::desktopClicked,
|
|
|
+// this, &SimpleScreenWall::onDesktopClicked);
|
|
|
+
|
|
|
+// connect(m_windowList, &SimpleWindowList::windowSelected,
|
|
|
+// this, &SimpleScreenWall::onWindowSelected);
|
|
|
+
|
|
|
+// connect(m_windowList, &SimpleWindowList::windowDoubleClicked,
|
|
|
+// this, &SimpleScreenWall::onWindowDoubleClicked);
|
|
|
+
|
|
|
+// connect(m_refreshTimer, &QTimer::timeout,
|
|
|
+// this, &SimpleScreenWall::refreshWindowList);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::setConfig(const SimpleScreenWallConfig& config)
|
|
|
+// {
|
|
|
+// m_config = config;
|
|
|
+
|
|
|
+// if (m_windowList) {
|
|
|
+// m_windowList->setThumbnailSize(config.thumbnailSize);
|
|
|
+// m_windowList->setShowMinimized(config.showMinimizedWindows);
|
|
|
+// }
|
|
|
+
|
|
|
+// // 桌面预览现在集成在窗口列表中,不需要单独设置
|
|
|
+
|
|
|
+// SimpleCacheManager::instance().setMaxCacheSize(config.maxCachedThumbnails);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::startScreenWall()
|
|
|
+// {
|
|
|
+// if (m_isRunning) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Starting SimpleScreenWall...";
|
|
|
+
|
|
|
+// m_isRunning = true;
|
|
|
+
|
|
|
+// // 桌面预览现在集成在窗口列表中
|
|
|
+
|
|
|
+// // 刷新窗口列表
|
|
|
+// refreshWindowList();
|
|
|
+
|
|
|
+// // 启动定时刷新
|
|
|
+// m_refreshTimer->start(m_config.windowUpdateInterval);
|
|
|
+
|
|
|
+// emit started();
|
|
|
+// qDebug() << "SimpleScreenWall started successfully";
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::stopScreenWall()
|
|
|
+// {
|
|
|
+// if (!m_isRunning) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// qDebug() << "Stopping SimpleScreenWall...";
|
|
|
+
|
|
|
+// m_isRunning = false;
|
|
|
+
|
|
|
+// // 停止定时器
|
|
|
+// m_refreshTimer->stop();
|
|
|
+
|
|
|
+// // 窗口预览功能已集成到窗口列表中
|
|
|
+
|
|
|
+// // 清理缓存
|
|
|
+// SimpleCacheManager::instance().clearCache();
|
|
|
+
|
|
|
+// m_selectedWindow = nullptr;
|
|
|
+
|
|
|
+// emit stopped();
|
|
|
+// qDebug() << "SimpleScreenWall stopped";
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::refreshWindowList()
|
|
|
+// {
|
|
|
+// if (m_windowList) {
|
|
|
+// m_windowList->refreshWindowList();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::onWindowSelected(HWND hwnd, const QString& title)
|
|
|
+// {
|
|
|
+// if (m_selectedWindow == hwnd) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// m_selectedWindow = hwnd;
|
|
|
+
|
|
|
+// if (hwnd && IsWindow(hwnd)) {
|
|
|
+// emit windowSelected(hwnd, title);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::onDesktopClicked()
|
|
|
+// {
|
|
|
+// // 取消窗口选择
|
|
|
+// if (m_selectedWindow) {
|
|
|
+// m_selectedWindow = nullptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// emit desktopSelected();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::onWindowDoubleClicked(HWND hwnd)
|
|
|
+// {
|
|
|
+// // 检查窗口句柄是否有效
|
|
|
+// if (!hwnd || !IsWindow(hwnd)) {
|
|
|
+// qDebug() << "Invalid window handle in double click event";
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 激活窗口
|
|
|
+// if (!SimpleScreenWallUtils::activateWindow(hwnd)) {
|
|
|
+// qDebug() << "Failed to activate window:" << hwnd;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::showEvent(QShowEvent* event)
|
|
|
+// {
|
|
|
+// QWidget::showEvent(event);
|
|
|
+
|
|
|
+// if (!m_isRunning) {
|
|
|
+// QTimer::singleShot(500, this, &SimpleScreenWall::startScreenWall);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::hideEvent(QHideEvent* event)
|
|
|
+// {
|
|
|
+// QWidget::hideEvent(event);
|
|
|
+
|
|
|
+// if (m_isRunning) {
|
|
|
+// stopScreenWall();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::resizeEvent(QResizeEvent* event)
|
|
|
+// {
|
|
|
+// QWidget::resizeEvent(event);
|
|
|
+
|
|
|
+// if (m_windowList) {
|
|
|
+// QTimer::singleShot(100, m_windowList, &SimpleWindowList::refreshWindowList);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWall::updateLayout()
|
|
|
+// {
|
|
|
+// // 根据窗口大小调整布局比例
|
|
|
+// int totalHeight = height();
|
|
|
+// int desktopHeight = totalHeight * 0.3;
|
|
|
+// int listHeight = totalHeight * 0.2;
|
|
|
+// int previewHeight = totalHeight * 0.5;
|
|
|
+
|
|
|
+// // 现在只有窗口列表,不需要复杂的布局分配
|
|
|
+// // m_windowList 会自动调整大小
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleCacheManager Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleCacheManager& SimpleCacheManager::instance()
|
|
|
+// {
|
|
|
+// static SimpleCacheManager instance;
|
|
|
+// return instance;
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleCacheManager::cacheThumbnail(HWND hwnd, const QPixmap& thumbnail)
|
|
|
+// {
|
|
|
+// m_thumbnailCache.insert(hwnd, new QPixmap(thumbnail));
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap SimpleCacheManager::getCachedThumbnail(HWND hwnd) const
|
|
|
+// {
|
|
|
+// QPixmap* cached = m_thumbnailCache.object(hwnd);
|
|
|
+// return cached ? *cached : QPixmap();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleCacheManager::cacheIcon(HWND hwnd, const QIcon& icon)
|
|
|
+// {
|
|
|
+// m_iconCache.insert(hwnd, new QIcon(icon));
|
|
|
+// }
|
|
|
+
|
|
|
+// QIcon SimpleCacheManager::getCachedIcon(HWND hwnd) const
|
|
|
+// {
|
|
|
+// QIcon* cached = m_iconCache.object(hwnd);
|
|
|
+// return cached ? *cached : QIcon();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleCacheManager::clearCache()
|
|
|
+// {
|
|
|
+// m_thumbnailCache.clear();
|
|
|
+// m_iconCache.clear();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleCacheManager::setMaxCacheSize(int size)
|
|
|
+// {
|
|
|
+// m_thumbnailCache.setMaxCost(size);
|
|
|
+// m_iconCache.setMaxCost(size);
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleScreenWallUtils Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// QPixmap SimpleScreenWallUtils::scalePixmap(const QPixmap& pixmap, const QSize& size, Qt::AspectRatioMode mode)
|
|
|
+// {
|
|
|
+// if (pixmap.isNull() || size.isEmpty()) {
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// return pixmap.scaled(size, mode, Qt::SmoothTransformation);
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap SimpleScreenWallUtils::addBorder(const QPixmap& pixmap, int borderWidth, const QColor& color)
|
|
|
+// {
|
|
|
+// if (pixmap.isNull() || borderWidth <= 0) {
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap result(pixmap.size() + QSize(borderWidth * 2, borderWidth * 2));
|
|
|
+// result.fill(color);
|
|
|
+
|
|
|
+// QPainter painter(&result);
|
|
|
+// painter.drawPixmap(borderWidth, borderWidth, pixmap);
|
|
|
+
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap SimpleScreenWallUtils::addShadow(const QPixmap& pixmap, int shadowSize, const QColor& color)
|
|
|
+// {
|
|
|
+// if (pixmap.isNull() || shadowSize <= 0) {
|
|
|
+// return pixmap;
|
|
|
+// }
|
|
|
+
|
|
|
+// QPixmap result(pixmap.size() + QSize(shadowSize * 2, shadowSize * 2));
|
|
|
+// result.fill(Qt::transparent);
|
|
|
+
|
|
|
+// QPainter painter(&result);
|
|
|
+// painter.setRenderHint(QPainter::Antialiasing);
|
|
|
+
|
|
|
+// // 绘制阴影
|
|
|
+// painter.setBrush(color);
|
|
|
+// painter.setPen(Qt::NoPen);
|
|
|
+// painter.drawRoundedRect(shadowSize, shadowSize, pixmap.width(), pixmap.height(), 5, 5);
|
|
|
+
|
|
|
+// // 绘制原图
|
|
|
+// painter.drawPixmap(0, 0, pixmap);
|
|
|
+
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+// QString SimpleScreenWallUtils::getSystemInfo()
|
|
|
+// {
|
|
|
+// QString info;
|
|
|
+// info += QString("OS: Windows\n");
|
|
|
+// info += QString("Qt Version: %1\n").arg(QT_VERSION_STR);
|
|
|
+// info += QString("Screen Count: %1\n").arg(QApplication::screens().count());
|
|
|
+
|
|
|
+// return info;
|
|
|
+// }
|
|
|
+
|
|
|
+// QStringList SimpleScreenWallUtils::getRunningProcesses()
|
|
|
+// {
|
|
|
+// QStringList processes;
|
|
|
+
|
|
|
+// DWORD processIds[1024], bytesReturned;
|
|
|
+// if (EnumProcesses(processIds, sizeof(processIds), &bytesReturned)) {
|
|
|
+// DWORD processCount = bytesReturned / sizeof(DWORD);
|
|
|
+
|
|
|
+// for (DWORD i = 0; i < processCount; i++) {
|
|
|
+// HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIds[i]);
|
|
|
+// if (hProcess) {
|
|
|
+// wchar_t processName[MAX_PATH];
|
|
|
+// DWORD size = MAX_PATH;
|
|
|
+// if (QueryFullProcessImageNameW(hProcess, 0, processName, &size)) {
|
|
|
+// QString fullPath = QString::fromWCharArray(processName);
|
|
|
+// processes.append(QFileInfo(fullPath).baseName());
|
|
|
+// }
|
|
|
+// CloseHandle(hProcess);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// return processes;
|
|
|
+// }
|
|
|
+
|
|
|
+// int SimpleScreenWallUtils::getSystemMemoryUsage()
|
|
|
+// {
|
|
|
+// MEMORYSTATUSEX memInfo;
|
|
|
+// memInfo.dwLength = sizeof(MEMORYSTATUSEX);
|
|
|
+// GlobalMemoryStatusEx(&memInfo);
|
|
|
+
|
|
|
+// return static_cast<int>(memInfo.dwMemoryLoad);
|
|
|
+// }
|
|
|
+
|
|
|
+// int SimpleScreenWallUtils::getCpuUsage()
|
|
|
+// {
|
|
|
+// // 简化实现,返回固定值
|
|
|
+// // 实际实现需要使用性能计数器
|
|
|
+// return 0;
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallUtils::saveConfig(const SimpleScreenWallConfig& config, const QString& filePath)
|
|
|
+// {
|
|
|
+// QString path = filePath;
|
|
|
+// if (path.isEmpty()) {
|
|
|
+// path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/screenwall_config.json";
|
|
|
+// }
|
|
|
+
|
|
|
+// QJsonObject json;
|
|
|
+// json["desktopUpdateInterval"] = config.desktopUpdateInterval;
|
|
|
+// json["windowUpdateInterval"] = config.windowUpdateInterval;
|
|
|
+// json["previewUpdateInterval"] = config.previewUpdateInterval;
|
|
|
+// json["thumbnailWidth"] = config.thumbnailSize.width();
|
|
|
+// json["thumbnailHeight"] = config.thumbnailSize.height();
|
|
|
+// json["desktopPreviewWidth"] = config.desktopPreviewSize.width();
|
|
|
+// json["desktopPreviewHeight"] = config.desktopPreviewSize.height();
|
|
|
+// json["maxCachedThumbnails"] = config.maxCachedThumbnails;
|
|
|
+// json["enableDesktopPreview"] = config.enableDesktopPreview;
|
|
|
+// json["enableWindowPreview"] = config.enableWindowPreview;
|
|
|
+// json["showMinimizedWindows"] = config.showMinimizedWindows;
|
|
|
+
|
|
|
+// QJsonDocument doc(json);
|
|
|
+
|
|
|
+// QDir().mkpath(QFileInfo(path).absolutePath());
|
|
|
+// QFile file(path);
|
|
|
+// if (file.open(QIODevice::WriteOnly)) {
|
|
|
+// file.write(doc.toJson());
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleScreenWallConfig SimpleScreenWallUtils::loadConfig(const QString& filePath)
|
|
|
+// {
|
|
|
+// QString path = filePath;
|
|
|
+// if (path.isEmpty()) {
|
|
|
+// path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/screenwall_config.json";
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleScreenWallConfig config; // 使用默认值
|
|
|
+
|
|
|
+// QFile file(path);
|
|
|
+// if (file.open(QIODevice::ReadOnly)) {
|
|
|
+// QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
|
|
|
+// QJsonObject json = doc.object();
|
|
|
+
|
|
|
+// if (json.contains("desktopUpdateInterval")) {
|
|
|
+// config.desktopUpdateInterval = json["desktopUpdateInterval"].toInt();
|
|
|
+// }
|
|
|
+// if (json.contains("windowUpdateInterval")) {
|
|
|
+// config.windowUpdateInterval = json["windowUpdateInterval"].toInt();
|
|
|
+// }
|
|
|
+// if (json.contains("previewUpdateInterval")) {
|
|
|
+// config.previewUpdateInterval = json["previewUpdateInterval"].toInt();
|
|
|
+// }
|
|
|
+// if (json.contains("thumbnailWidth") && json.contains("thumbnailHeight")) {
|
|
|
+// config.thumbnailSize = QSize(json["thumbnailWidth"].toInt(), json["thumbnailHeight"].toInt());
|
|
|
+// }
|
|
|
+// if (json.contains("desktopPreviewWidth") && json.contains("desktopPreviewHeight")) {
|
|
|
+// config.desktopPreviewSize = QSize(json["desktopPreviewWidth"].toInt(), json["desktopPreviewHeight"].toInt());
|
|
|
+// }
|
|
|
+// if (json.contains("maxCachedThumbnails")) {
|
|
|
+// config.maxCachedThumbnails = json["maxCachedThumbnails"].toInt();
|
|
|
+// }
|
|
|
+// if (json.contains("enableDesktopPreview")) {
|
|
|
+// config.enableDesktopPreview = json["enableDesktopPreview"].toBool();
|
|
|
+// }
|
|
|
+// if (json.contains("enableWindowPreview")) {
|
|
|
+// config.enableWindowPreview = json["enableWindowPreview"].toBool();
|
|
|
+// }
|
|
|
+// if (json.contains("showMinimizedWindows")) {
|
|
|
+// config.showMinimizedWindows = json["showMinimizedWindows"].toBool();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// return config;
|
|
|
+// }
|
|
|
+
|
|
|
+// // ============================================================================
|
|
|
+// // SimpleScreenWallWindow Implementation
|
|
|
+// // ============================================================================
|
|
|
+
|
|
|
+// SimpleScreenWallWindow::SimpleScreenWallWindow(QWidget* parent)
|
|
|
+// : QWidget(parent)
|
|
|
+// , m_mainLayout(nullptr)
|
|
|
+// , m_controlPanel(nullptr)
|
|
|
+// , m_controlLayout(nullptr)
|
|
|
+// , m_startButton(nullptr)
|
|
|
+// , m_stopButton(nullptr)
|
|
|
+// , m_refreshButton(nullptr)
|
|
|
+// , m_settingsButton(nullptr)
|
|
|
+// , m_statusLabel(nullptr)
|
|
|
+// , m_screenWall(nullptr)
|
|
|
+// {
|
|
|
+// setupUI();
|
|
|
+// setupConnections();
|
|
|
+
|
|
|
+// setWindowTitle("简化版屏幕墙");
|
|
|
+// setMinimumSize(1000, 700);
|
|
|
+// resize(1200, 900);
|
|
|
+// }
|
|
|
+
|
|
|
+// SimpleScreenWallWindow::~SimpleScreenWallWindow()
|
|
|
+// {
|
|
|
+// if (m_screenWall && m_screenWall->isRunning()) {
|
|
|
+// m_screenWall->stopScreenWall();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::setupUI()
|
|
|
+// {
|
|
|
+// m_mainLayout = new QVBoxLayout(this);
|
|
|
+// m_mainLayout->setContentsMargins(5, 5, 5, 5);
|
|
|
+// m_mainLayout->setSpacing(5);
|
|
|
+
|
|
|
+// // 控制面板
|
|
|
+// m_controlPanel = new QWidget(this);
|
|
|
+// m_controlLayout = new QHBoxLayout(m_controlPanel);
|
|
|
+// m_controlLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
+
|
|
|
+// m_startButton = new QPushButton("启动屏幕墙", this);
|
|
|
+// m_stopButton = new QPushButton("停止屏幕墙", this);
|
|
|
+// m_refreshButton = new QPushButton("刷新窗口", this);
|
|
|
+// m_settingsButton = new QPushButton("设置", this);
|
|
|
+
|
|
|
+// m_statusLabel = new QLabel("状态: 已停止", this);
|
|
|
+
|
|
|
+// m_controlLayout->addWidget(m_startButton);
|
|
|
+// m_controlLayout->addWidget(m_stopButton);
|
|
|
+// m_controlLayout->addWidget(m_refreshButton);
|
|
|
+// m_controlLayout->addWidget(m_settingsButton);
|
|
|
+// m_controlLayout->addStretch();
|
|
|
+// m_controlLayout->addWidget(m_statusLabel);
|
|
|
+
|
|
|
+// m_mainLayout->addWidget(m_controlPanel);
|
|
|
+
|
|
|
+// // 屏幕墙组件
|
|
|
+// m_screenWall = new SimpleScreenWall(this);
|
|
|
+// m_mainLayout->addWidget(m_screenWall, 1);
|
|
|
+
|
|
|
+// updateControlButtons();
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::setupConnections()
|
|
|
+// {
|
|
|
+// connect(m_startButton, &QPushButton::clicked, this, &SimpleScreenWallWindow::startScreenWall);
|
|
|
+// connect(m_stopButton, &QPushButton::clicked, this, &SimpleScreenWallWindow::stopScreenWall);
|
|
|
+// connect(m_refreshButton, &QPushButton::clicked, this, &SimpleScreenWallWindow::refreshWindows);
|
|
|
+// connect(m_settingsButton, &QPushButton::clicked, this, &SimpleScreenWallWindow::showSettings);
|
|
|
+
|
|
|
+// if (m_screenWall) {
|
|
|
+// connect(m_screenWall, &SimpleScreenWall::windowSelected, this, &SimpleScreenWallWindow::onWindowSelected);
|
|
|
+// connect(m_screenWall, &SimpleScreenWall::desktopSelected, this, &SimpleScreenWallWindow::onDesktopSelected);
|
|
|
+// connect(m_screenWall, &SimpleScreenWall::started, this, &SimpleScreenWallWindow::onScreenWallStarted);
|
|
|
+// connect(m_screenWall, &SimpleScreenWall::stopped, this, &SimpleScreenWallWindow::onScreenWallStopped);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::updateControlButtons()
|
|
|
+// {
|
|
|
+// bool isRunning = m_screenWall && m_screenWall->isRunning();
|
|
|
+
|
|
|
+// m_startButton->setEnabled(!isRunning);
|
|
|
+// m_stopButton->setEnabled(isRunning);
|
|
|
+// m_refreshButton->setEnabled(isRunning);
|
|
|
+
|
|
|
+// m_statusLabel->setText(isRunning ? "状态: 运行中" : "状态: 已停止");
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::closeEvent(QCloseEvent* event)
|
|
|
+// {
|
|
|
+// if (m_screenWall && m_screenWall->isRunning()) {
|
|
|
+// m_screenWall->stopScreenWall();
|
|
|
+// }
|
|
|
+// QWidget::closeEvent(event);
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::startScreenWall()
|
|
|
+// {
|
|
|
+// if (m_screenWall) {
|
|
|
+// m_screenWall->startScreenWall();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::stopScreenWall()
|
|
|
+// {
|
|
|
+// if (m_screenWall) {
|
|
|
+// m_screenWall->stopScreenWall();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::refreshWindows()
|
|
|
+// {
|
|
|
+// if (m_screenWall) {
|
|
|
+// m_screenWall->refreshWindowList();
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::showSettings()
|
|
|
+// {
|
|
|
+// QMessageBox::information(this, "设置", "设置功能尚未实现");
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::showAbout()
|
|
|
+// {
|
|
|
+// QMessageBox::about(this, "关于", "简化版屏幕墙\n版本: 1.0\n\n实时窗口预览系统");
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::onWindowSelected(HWND hwnd, const QString& title)
|
|
|
+// {
|
|
|
+// Q_UNUSED(hwnd)
|
|
|
+// m_statusLabel->setText(QString("已选择窗口: %1").arg(title));
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::onDesktopSelected()
|
|
|
+// {
|
|
|
+// m_statusLabel->setText("已选择桌面预览");
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::onScreenWallStarted()
|
|
|
+// {
|
|
|
+// updateControlButtons();
|
|
|
+// m_statusLabel->setText("状态: 运行中");
|
|
|
+// }
|
|
|
+
|
|
|
+// void SimpleScreenWallWindow::onScreenWallStopped()
|
|
|
+// {
|
|
|
+// updateControlButtons();
|
|
|
+// m_statusLabel->setText("状态: 已停止");
|
|
|
+// }
|