Windows 7桌面显示图标窗口句柄的获取

在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/WIN10下,桌面图标窗口的层级从上到下为:(通过spy++来查看窗口的层级关系等信息!)

"#32769 (桌面)"  ---> "WorkerW" ---> "SHELLDLL_DefView" ---> "SysListView32"   (根据窗口类名排列)

"#32769 (桌面)":为桌面窗口,通过函数GetDesktopWindow即可获得该窗口句柄;

“SysListView32”:为包含桌面图标的窗口,其实是一个CListCtrl类列表控件,所以要想操作桌面上图标可以通过操作列表控件来操作!

原文地址:https://www.cnblogs.com/2018shawn/p/9833276.html

时间: 2024-10-10 07:16:52

Windows 7桌面显示图标窗口句柄的获取的相关文章

Windows 托盘区域显示图标

NOTIFYICONDATA structure 这个结构体包含了向通知区域(底部任务栏右下角区域,下面都称为托盘)显示的信息.需要使用函数Shell_NotifyIcon. 结构体成员 1 typedef struct _NOTIFYICONDATA { 2 DWORD cbSize; 3 HWND hWnd; 4 UINT uID; 5 UINT uFlags; 6 UINT uCallbackMessage; 7 HICON hIcon; 8 TCHAR szTip[64]; 9 DWOR

fedora 20 如何在桌面显示图标

最近一位朋友问我为啥现在的 gnome 桌面上什么都不显示了.还有应用程序窗口上最大化.最小化的按钮怎么也都没了. 为啥呢,我只能说设计 gnome 的人都是傻 X,无他. 不过通过安装个gnome 的插件,还能解决这个问题. 首先安装 gnome-tweak-tool,安装方法就不多说了. 安装完之后,可以搜索 优化工具.图标有点像是个调音台. 之后就能进入 tweaks 的设置界面了. 在桌面那一栏里,可以开启 Icons on Desktop. 在窗口那一栏里,可以开启 应用程序的最大化和

Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

参考: http://dev.xiaomi.com/doc/p=3904/index.html http://my.oschina.net/ososchina/blog/352286?p=1#comments https://github.com/leolin310148/ShortcutBadger http://www.voidcn.com/blog/kongbaidepao/article/p-62251.html http://www.eoeandroid.com/thread-5572

Windows server 2008 R2如何预览图片而不是显示图标?

? Previews of media files are disabled by default in Windows Server 2008. In this article we will enable it so we get the small previews back again! 1. Open the?Start?menu and click?Run. Now enter?SystemPropertiesPerformance?and click?OK. In the?Perf

控制桌面的图标显示

如何控制桌面的图标显示 通常很多用户还是习惯于在桌面上保留“我的文档”及其他经常访问文件夹快捷方式以及经常使用的程序快捷方式.如果你想在桌面上显示“我的电脑”.“我的文档”.“网上邻居”.IE浏览器的快捷方式图标,只需进行如下操作 :在桌面单击鼠标右键,在右键菜单中选择“属性”命令,在打开的“显示 属性”对话框中选择“桌面”选项卡,单击“自定义桌面”按钮,打开“桌面”项目对话框.在“常规”选项卡的“桌面图标”栏中选择所需项目的复选框,然后单击“确定”返回上一级对话框,再单击“应用”按钮即可. 如

windows桌面快捷方式图标上面怎么老是会产生一个问号解决方案

桌面快捷方式图标上面怎么老是会产生一个问号(获取帮助符号)? 新建一txt文件,如:a.txt, 复制该代码:for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"改后缀名为.bat类型,如:a.bat , ,而后双击直接运行即可解决问题.

windows 触发桌面图标布局保存

问题: 项目原有的一套结构由于引进了一个磁盘套件,类似于关闭系统的explorer.exe进程,进入到他所维护的explorer.exe中.于是出现了当退出磁盘的时候没有保存好桌面布局信息导致下次进入的时候磁盘中的桌面信息又变成初始化的状态了. 这里分析后问题所在就是没有提供自动保存桌面信息的机制,所以磁盘退出的时候没有将说面事实状态信息保存到注册表. 解决过程: 查阅资料知道,Windows将桌面布局信息都在注册表\HKEY_CURRENT_USER\SoftWare\Microsoft\Wi

windows之桌面程序引导功能

经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过这供功能是怎么实现的呢,使用一般的窗口spy工具应该都能抓取windows系统桌面使用的窗口类,我使用彗星小助手抓取了下,效果如图1所示.原来windows桌面窗口是一个listview,那么问题就变得简单了,我们只需要拿到窗口句柄,并向其发送消息LVM_GETITEMCOUNT消息,获取到窗口it

Win10系统,桌面显示不正常咋办?

有些时候,当我们使用Win10时会遇到桌面图标显示不正常的问题,其表现为图标显示为未知文件类型,或者是显示错乱,等等.虽然图标显示不正常不影响使用,但是看起来总是让人别扭.该问题在前几代Windows系统中同样经常出现,包括Win7.Win8.Win8.1.如果你遇到了这个问题可参考下面的方法来解决. 为了加速显示图标,系统会对文件/程序的图标进行缓存,这些缓存内容都存储在一个名为Iconcache.db的缓存文件中,当用户再次查看这些文件/程序时,不需要再从DLL等文件中重新获取图标,起到加速