阅读本文并尝试使用 C++ 后
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus
我设法将我的窗口设置为 WorkerW 窗口的子窗口,该窗口绘制在桌面图标后面
但问题是,当用户更改到下一个壁纸或幻灯片时,我检测到动画开始后的事件,该事件使用淡入淡出动画更改壁纸,生成一个新的 WorkerW,它在现有 WorkerW 之上绘制,所以有吗有什么方法可以让新的 WorkerW 句柄在我的窗口后面绘制,或者使我的新 WorkerW 的子窗口非常快,以便在我的窗口上绘制不明显?
[编辑2:]
我设法将窗口放置在 SHELLDLL 视图内和桌面图标顶部(即列表视图)[GLFW30 命名为其中之一]
重现:
从任何应用程序获取窗口句柄。
打开Spy++并找到SHELLDLL视图的窗口句柄并将其从十六进制转换为十进制,然后将其传递到SetParent(windowHWND, targetHWND)中。
SetWindowPos 将listView32窗口句柄作为hwndInsertAfter参数传递,然后运行程序,我们当前的窗口将被放置在listview32的下方
但可悲的是,listview32 覆盖了我窗口的所有背景绘画,只显示当前的 Windows 壁纸:(
我观察到类似的现象:在Win11 23H2上切换系统主题时,会绘制淡入和淡出,短暂覆盖动态壁纸窗口;切换虚拟桌面时,动态壁纸会有撕裂感【这是因为绘制的系统壁纸的滑动动画覆盖了我们Z轴上的窗口。程序窗口将设置在 WorkerW 2 窗口的前面;然后将包含桌面图标窗口的WorkerW 1窗口移动到Desktop Band,并首先将WorkerW 1窗口的Z-order设置为类名tooltips_class32的窗口的前面,然后将WorkerW 1窗口设置为底部桌面窗口的窗口。这会导致桌面图标窗口在Desktop Band后面不可见,导致动画出现时PM窗口或镜像水平滑动,我们会观察到桌面图标短暂消失;在Win11 24H2预览版上切换壁纸或主题会导致WorkerW窗口关闭。
我认为解决这些问题可能需要修补explorer.exe。