获取桌面图标列表并修改其位置、显隐时,代码计数返回0如何解决?
搞定桌面图标列表获取失败的问题
我帮你捋捋为啥你的代码拿不到桌面图标数量,以及怎么修复这个问题~
首先看你代码里的明显问题:你用到了hShellWnd但根本没定义它,应该是想写之前获取的hDefView吧?不过就算修正这个变量名,在Windows 10及以上版本,直接从GetDesktopWindow()下面找SHELLDLL_DefView已经行不通了——微软早就调整了桌面的窗口结构。
正确的获取姿势
现在Windows 10/11的桌面图标,是放在WorkerW窗口的子层级里的(而且可能有多个WorkerW,只有包含SHELLDLL_DefView的那个才是管图标的)。给你修正后的代码:
HWND hDesktop = GetDesktopWindow(); HWND hWorkerW = NULL; // 遍历所有WorkerW窗口,找到带图标的那个 do { hWorkerW = FindWindowEx(hDesktop, hWorkerW, L"WorkerW", NULL); if (hWorkerW) { HWND hDefView = FindWindowEx(hWorkerW, NULL, L"SHELLDLL_DefView", NULL); if (hDefView) { HWND folderView = FindWindowEx(hDefView, NULL, L"SysListView32", NULL); if (folderView) { int count = (int)SendMessage(folderView, LVM_GETITEMCOUNT, 0, 0); // 这下应该能拿到正确的桌面图标数量了 break; } } } } while (hWorkerW != NULL);
为啥原来的方法失效了?
在Windows 7及更早的系统里,桌面图标确实直接挂在GetDesktopWindow()的SHELLDLL_DefView下面,但从Windows 10开始,微软把桌面的壁纸、图标等元素拆分到不同的WorkerW窗口管理,只有包含SHELLDLL_DefView的那个WorkerW才是真正的图标容器,其他WorkerW可能只是用来显示壁纸或其他桌面组件的。
额外要注意的点
- 一定要保证你的程序编译位数和系统匹配(32位程序跑32位系统,64位跑64位),不然跨位数调用
SendMessage会出各种奇怪的问题 - 如果你要修改图标位置、隐藏/显示图标,可以用
LVM_SETITEMPOSITION(改位置)、LVM_SETITEMSTATE(改显示状态)这类消息,不过操作前得先拿到对应图标的ITEM信息 - 要是遇到平板模式这类特殊场景,窗口结构可能还会有变化,需要额外做判断
内容的提问来源于stack exchange,提问作者user8995748
相关产品推荐
相关产品推荐

