C++ 获取windows活动窗口

文章介绍了如何遍历Windows系统中的可见窗口,排除不需要的如工具栏、隐藏窗口等,通过EnumWindowsProc回调函数和DwmGetWindowAttribute检查窗口属性,实现类似Alt+Tab的预览功能。
摘要由CSDN通过智能技术生成

 前言

最近为了能够共享windows应用窗口内容,需要遍历桌面所有窗口,其中也遇到了不少的坑,比如遇到了很多不需要的窗口,无标题窗口,windows设置,邮件和计算器。好在最后还是实现了。这里直接上主要功能代码,避免大家踩坑。 

代码

windowIterator.h

class CWindowIterator
{

private:
    static char* wchar2char(const wchar_t* wchar);
    static BOOL CALLBACK EnumWindowsProc(HWND window, LPARAM lParam);

public:
    using EnumCallback = std::function<void(std::string &str)>;
    
    void EnumWindow(EnumCallback callback);

};

 windowIterator.cpp

char* CWindowIterator::wchar2char(const wchar_t* wchar)
{
    char* pchar;
    int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
    pchar = new char[len + 1];
    WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), pchar, len, NULL, NULL);
    pchar[len] = '\0';
    return pchar;
}

BOOL CALLBACK CWindowIterator::EnumWindowsProc(HWND window, LPARAM lParam)
{
    if (!IsWindow(window))
        return TRUE;

    if (!IsWindowVisible(window))
        return TRUE;

    DWORD flag = 0;
    DwmGetWindowAttribute(window, DWMWA_CLOAKED, &flag, sizeof(flag));
    if (flag)
        return TRUE;

    UINT wnd_style_ex = GetWindowLong(window, GWL_EXSTYLE);
    if ((WS_EX_TOOLWINDOW & wnd_style_ex) == WS_EX_TOOLWINDOW)
        return TRUE;

    TCHAR szTitle[MAX_PATH] = { 0 };
    ::GetWindowText(window, szTitle, MAX_PATH); // 获取标题
    if (wcslen(szTitle) == 0)
        return TRUE;

    std::string str = wchar2char(szTitle);
    if (lParam) {
        EnumCallback* cb = reinterpret_cast<EnumCallback*>(lParam);
        (*cb)(str);
    }

    return TRUE;
}

void CWindowIterator::EnumWindow(EnumCallback callback)
{
    ::EnumWindows(EnumWindowsProc, (LPARAM)&callback);
}

windowIteratorTest.cpp 

#include <iostream>
#include "windowIterator.h"

int main()
{
    CWindowIterator wi;
    wi.EnumWindow([](std::string &str) {
        std::cout << str << std::endl;
        });
    return 0;
}

总结

总结了一下过程,需要能够获取类似alt + tab一样的预览窗口,主要是注意以下几点

1) 窗口必须可见 - 使用 GetWindowVisible

2) 窗口不能是工具栏窗口 - 使用 GetWindowLong

3) 不得隐藏窗口 - 使用 DwmGetWindowAttribute

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值