/* 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
文章发布于 2015-02-16 00:56:44 CSDN,现转博客园。
sdragonx https://github.com/sdragonx