Windows 7桌面显示图标窗口类名称
2015-09-16 17:56
555 查看
在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句:
可是在windows 7时代,上述代码失效了,经过SKY++分析,发现类名为"Progman"的窗口根本就没有子窗口,而桌面图标窗口在一个类名为"WorkerW"的窗口下面。其中:窗口"FloderView"(类名SysListView32)即为桌面图标窗口,因此,老的方法自然无法成功,但是由于类名为"WorkerW"的窗口不止一个,所以必须遍历到含有类名为"SHELLDLL_DefView"子窗口的才是,故:
Windows 7下,我们取桌面图标窗口的句柄使用以下语句:
好了,经过尝试,这段代码确实可以再win7下正常工作,但是肯定不能再winXp下正常工作(我没有尝试),因此,要写出具有通用性的代码,这段代码还需网友改进(其实上面两段代码加以判断叠加即可)
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 hParent = NULL; HWND hDefView = NULL; HWND hDeskIcon = NULL; //获得第一个WorkerW类的窗口 hParent = FindWindowEx(0, 0, L"WorkerW", L""); //接着遍历 while ((!hDefView) && hParent) { hDefView = FindWindowEx(hParent, 0, L"SHELLDLL_DefView", 0); hParent = FindWindowEx(0, hParent, L"WorkerW", L""); } hDeskIcon = FindWindowEx(hDefView,0,L"SysListView32",L"FolderView");
好了,经过尝试,这段代码确实可以再win7下正常工作,但是肯定不能再winXp下正常工作(我没有尝试),因此,要写出具有通用性的代码,这段代码还需网友改进(其实上面两段代码加以判断叠加即可)
相关文章推荐
- 集合类 Map集合
- Loadrunner发送json串请求
- 解决ntpdate error: no server suitable for synchronization found
- 一些操作字符串的方法
- 朱子家训
- MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
- 个人收集的iOS开源动画-----长期跟新
- hi3518e音频G711调试笔记
- Java初体验
- 游戏开发团队及工作流程
- 「动态规划」Palindrome Partitioning II
- java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger
- OpenStack路: OpenStack建筑设计指南 - 概要(摘录和翻译)
- 用dispatch组让下一个操作在当前操作完成后再执行,即同步操作
- 素数判定
- wampserver,eclipse,PHPeclipse搭建php开发环境
- angularJs编写多指令的情况
- 迭代,经常见到这个词,竟然不知其意。
- 位移枚举
- SpringMVC 使用 AOP注解