ENV
- Windows 10
- Visual Studio 2022
- Github: probe,
src/graphics/display-windows.cpp
Source
main.cpp
#include <dwmapi.h>
#include <iostream>
#include <string>
#include <iomanip>
static std::pair<std::wstring, std::wstring> window_name_of(HWND hwnd)
{
// title
std::wstring name;
auto name_len = ::GetWindowTextLength(hwnd);
if (name_len > 0)
{
name.resize(name_len + 1, {});
name_len = ::GetWindowText(hwnd, name.data(), name_len + 1);
}
// classname
std::wstring classname(256, {});
auto cnlen = ::GetClassName(hwnd, classname.data(), 256);
return {name.substr(0, name_len), classname.substr(0, cnlen)};
}
static bool IsWindowCloaked(HWND hwnd)
{
BOOL is_cloaked = false;
return SUCCEEDED(::DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &is_cloaked, sizeof(is_cloaked))) && is_cloaked;
}
int main()
{
// Z-index: up to down
// only including the windows in current virtual desktop (WIN + TAB: virtual desktops)
for (auto hwnd = ::GetTopWindow(nullptr); hwnd != nullptr;
hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT))
{
auto [name, classname] = window_name_of(hwnd);
// rect
RECT rect{};
::DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rect, sizeof(RECT));
// visible
bool visible = ::IsWindowVisible(hwnd) && !IsWindowCloaked(hwnd);
if (!visible) continue;
std::wcout << "'" << std::right << std::setw(36) << name << "' - '" << std::left << std::setw(48) <<classname << "', "
<< "visible = " << visible << ", "
<< "rect = (" << rect.left << "," << rect.top << "), (" << rect.right << ", " << rect.bottom << ")\n";
}
return 0;
}
输出
' ' - 'Shell_TrayWnd ', visible = 1, rect = (0,1392), (2560, 1440)
' ' - 'PseudoConsoleWindow ', visible = 1, rect = (0,0), (16, 16)
' PowerShell' - 'CASCADIA_HOSTING_WINDOW_CLASS ', visible = 1, rect = (1060,449), (2534, 1047)
'ffiirree/probe: Hardware and OS information for C++ - Google Chrome' - 'Chrome_WidgetWin_1 ', visible = 1, rect = (1280,0), (2560, 1392)
'main.cpp - windect - Visual Studio Code' - 'Chrome_WidgetWin_1 ', visible = 1, rect = (0,0), (2560, 1392)
' windect' - 'CabinetWClass ', visible = 1, rect = (500,350), (1817, 1186)
'Welcome - FFmpeg - Visual Studio Code' - 'Chrome_WidgetWin_1 ', visible = 1, rect = (768,336), (1792, 1104)
' ' - 'WorkerW ', visible = 1, rect = (0,0), (2560, 1440)
' ' - 'WorkerW ', visible = 1, rect = (0,0), (2560, 1440)
' Program Manager' - 'Progman ', visible = 1, rect = (0,0), (2560, 1440)
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(windect LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
PRIVATE
$<$<PLATFORM_ID:Windows>:dwmapi>
)