Windows获取窗口列表

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>
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值