Windows 7桌面显示图标窗口句柄的获取
2015-05-24 23:01
447 查看
在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句:
HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
可是在windows 7时代,上述代码失效了,经过SKY++分析,发现类名为"Progman"的窗口根本就没有子窗口,而桌面图标窗口在一个类名为"WorkerW"的窗口下面,如图:
其中:窗口"FloderView"(类名SysListView32)即为桌面图标窗口,因此,老的方法自然无法成功,但是由于类名为"WorkerW"的窗口不止一个,所以必须遍历到含有类名为"SHELLDLL_DefView"子窗口的才是,故:
Windows 7下,我们取桌面图标窗口的句柄使用以下语句:
HWND dwndparent;
HWND dwndviem=NULL;
HWND dwdesktopicon;
dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口,
while((!dwndviem)&&dwndparent)//因为可能会有多个窗口类名为“WorkerW”的窗口存在,所以只能依次遍历
{
dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
}
dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");
好了,经过尝试,这段代码确实可以再win7下正常工作,但是肯定不能再winXp下正常工作(我没有尝试),因此,要写出具有通用性的代码,这段代码还需网友改进(其实上面两段代码加以判断叠加即可)
综上:在win7下,桌面图标窗口的层级从上到下为:(通过spy++来查看窗口的层级关系等信息!)
"#32769 (桌面)" ---> "WorkerW" ---> "SHELLDLL_DefView" ---> "SysListView32" (根据窗口类名排列)
"#32769 (桌面)":为桌面窗口,通过函数GetDesktopWindow即可获得该窗口句柄;
“SysListView32”:为包含桌面图标的窗口,其实是一个CListCtrl类列表控件,所以要想操作桌面上图标可以通过操作列表控件来操作!
HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
可是在windows 7时代,上述代码失效了,经过SKY++分析,发现类名为"Progman"的窗口根本就没有子窗口,而桌面图标窗口在一个类名为"WorkerW"的窗口下面,如图:
其中:窗口"FloderView"(类名SysListView32)即为桌面图标窗口,因此,老的方法自然无法成功,但是由于类名为"WorkerW"的窗口不止一个,所以必须遍历到含有类名为"SHELLDLL_DefView"子窗口的才是,故:
Windows 7下,我们取桌面图标窗口的句柄使用以下语句:
HWND dwndparent;
HWND dwndviem=NULL;
HWND dwdesktopicon;
dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口,
while((!dwndviem)&&dwndparent)//因为可能会有多个窗口类名为“WorkerW”的窗口存在,所以只能依次遍历
{
dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
}
dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");
好了,经过尝试,这段代码确实可以再win7下正常工作,但是肯定不能再winXp下正常工作(我没有尝试),因此,要写出具有通用性的代码,这段代码还需网友改进(其实上面两段代码加以判断叠加即可)
综上:在win7下,桌面图标窗口的层级从上到下为:(通过spy++来查看窗口的层级关系等信息!)
"#32769 (桌面)" ---> "WorkerW" ---> "SHELLDLL_DefView" ---> "SysListView32" (根据窗口类名排列)
"#32769 (桌面)":为桌面窗口,通过函数GetDesktopWindow即可获得该窗口句柄;
“SysListView32”:为包含桌面图标的窗口,其实是一个CListCtrl类列表控件,所以要想操作桌面上图标可以通过操作列表控件来操作!
相关文章推荐
- Windows 7桌面显示图标窗口类名称
- windows桌面图标显示大小异常
- 20171227-如何让Windows 2012R2显示桌面图标?
- c# 获取windows桌面图标 张宇轩
- 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的桌面,显示我的电脑图标
- 获取桌面窗口的句柄
- windows下点击任务栏“显示桌面”图标弹出记事本故障解决
- [VC++]如何得到桌面窗口的句柄(桌面图标)
- QT里,windows下获取窗口句柄的方法
- windows桌面通知区域不显示音量图标的解决方法
- C# Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法
- 获取桌面图标句柄
- [VC++]如何得到桌面窗口的句柄(桌面图标)
- WINDOWS 7 如何显示桌面上的IE图标
- Windows 7 C# OCX 无法获取“****”控件的窗口句柄,不支持无窗口的ActiveX控件的解决办法
- windows 下在一个进程中使用createprocess创建一个窗口进程,并获取这个窗口的HWND句柄
- #100309#如何恢复windows的显示桌面图标
- VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法
- Windows 7下桌面IE图标显示与修复的完美解决方法
- windows7系统找不到显示桌面图标(无需窗口最小化也可看得到)