文章标题 原创 翻译 转载 文章内容 窗口信息主要有:窗口句柄、标题、类名、区域,还有一个ZOrder,它表示窗口显示在桌面的上下层级,窗口是否被遮盖。 ``` #include <qt_windows.h> #include <QDebug> int GetWindowZOrder(HWND hwnd); struct WindowInfo { HWND hWnd; QRect rect; QString title; QString className; int zOrder() { return GetWindowZOrder(hWnd); } QString debugString() { return QString().sprintf("hWnd:0x%x, ", hWnd) + QString("order:%1, title:%2, class:%3, rect:%4,%5,%6,%7").arg(zOrder()).arg(title).arg(className). arg(rect.left()).arg(rect.top()).arg(rect.width()).arg(rect.height()); } }; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { std::vector<HWND>* window_list = reinterpret_cast<std::vector<HWND>*>(lParam); if (::IsWindow(hwnd) && ::IsWindowVisible(hwnd)) { window_list->push_back(hwnd); } return TRUE; } QVector<WindowInfo> getAllValidWindows() { QVector<WindowInfo> result; std::vector<HWND> window_list; EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&window_list)); const int BUFFER_LEN = 1024; for (auto it = window_list.rbegin(); it != window_list.rend(); ++it) { TCHAR buf[BUFFER_LEN] = { 0 }; ::GetWindowText(*it, buf, BUFFER_LEN - 1); TCHAR buf2[BUFFER_LEN] = { 0 }; ::GetClassName(*it, buf2, BUFFER_LEN - 1); RECT rect = { 0 }; ::GetWindowRect(*it, &rect); QRect qrect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); if (qrect.isValid()) { WindowInfo info; info.className = QString::fromStdWString(buf2); info.hWnd = *it; info.rect = qrect; info.title = QString::fromStdWString(buf); result.push_back(info); } } return result; } int GetWindowZOrder(HWND hwnd) { int zorder = 0; HWND hwndPrev = NULL; for (HWND hwndNext = GetTopWindow(NULL); hwndNext != NULL; hwndNext = GetNextWindow(hwndNext, GW_HWNDNEXT)) { if (hwndNext == hwnd) return zorder; if (IsWindowVisible(hwndNext)) { hwndPrev = hwndNext; zorder++; } } if (hwndPrev) return zorder; return -1; } ``` 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交