Windows 桌面各个窗口的获取

这篇博客介绍了如何使用C++在Windows操作系统中获取桌面窗口、任务栏、Shell视图窗口以及系统列表窗口的方法。通过查找特定的窗口类名,如`Shell_TrayWnd`、`Progman`、`SHELLDLL_DefView`和`SysListView32`,可以分别获取到任务栏、外壳视图、系统列表和桌面壁纸窗口。

/*


 shellwindow.h


 sdragonx 2015-02-12 12:23:16


*/
#ifndef SHELLWINDOW_H_20150212122316
#define SHELLWINDOW_H_20150212122316


#include <windows.h>


const static PTCHAR CLASS_NAME_TASKMAN = TEXT("Shell_TrayWnd");
const static PTCHAR CLASS_NAME_PROGMAN = TEXT("Progman");
const static PTCHAR CLASS_NAME_SHELL   = TEXT("SHELLDLL_DefView");
const static PTCHAR CLASS_NAME_SYSLIST = TEXT("SysListView32");
const static PTCHAR CLASS_NAME_WORKERW = TEXT("WorkerW");


//GetDesktopWindow取得的窗口是绝对的父亲,在spy++中所有窗口都是它的子孙,
//由Windows环境子系统进程CSRSS.exe创建。窗口类名#32769


//任务栏
HWND GetTaskmanWindow()
{
return FindWindow(CLASS_NAME_TASKMAN, NULL);
}


//GetShellWindow(),取得的窗口是个顶层窗口,由explorer.exe创建。窗口类名Progman。
//如果没有外壳进程存在,这个函数返回NULL。
HWND GetProgmanWindow()
{
//return FindWindow(CLASS_NAME_PROGMAN, NULL);
return ::GetShellWindow();
}


//菜单层
HWND GetShellViewWindow()
{
HWND hProgmanWindow = GetProgmanWindow();
HWND hShellWindow = NULL;
HWND hWorkerW = NULL;


hShellWindow = FindWindowEx(hProgmanWindow, NULL, CLASS_NAME_SHELL, NULL);
if(hShellWindow)
{
return hShellWindow;
}


while(!hShellWindow)
{
hWorkerW = FindWindowEx(NULL, hWorkerW, CLASS_NAME_WORKERW, NULL);
if(!hWorkerW)
break;
hShellWindow = FindWindowEx(hWorkerW, NULL, CLASS_NAME_SHELL, NULL);
}
return hShellWindow;
}


//图标层
HWND GetSysListWindow()
{
return FindWindowEx(GetShellViewWindow(), NULL, CLASS_NAME_SYSLIST, NULL);
}


//获得动态壁纸层
//这个会返回false,因为win8的桌面层次不稳定
//纯色 xp结构
//普通  Progman
//    WorkerW\SHELLDLL_DefView\SysListView32
//Win8.1在幻灯片模式下,才有这个动态壁纸层
HWND GetDesktopWallpaperWindow()
{
    HWND hProgmanWindow = GetProgmanWindow();
    HWND hWorkerW = FindWindow(CLASS_NAME_WORKERW, NULL);
    while(hWorkerW)
    {
        if(GetParent(hWorkerW) == hProgmanWindow)
            break;
        hWorkerW = FindWindowEx(NULL, hWorkerW, CLASS_NAME_WORKERW, NULL);
    }


    return hWorkerW;
}
#endif //SHELLWINDOW_H_20150212122316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值