更换壁纸时防止在 WorkerW 下的子窗口上绘制

问题描述 投票:0回答:1

阅读本文并尝试使用 C++ 后

https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus

我设法将我的窗口设置为 WorkerW 窗口的子窗口,该窗口绘制在桌面图标后面
enter image description here

但问题是,当用户更改到下一个壁纸或幻灯片时,我检测到动画开始后的事件,该事件使用淡入淡出动画更改壁纸,生成一个新的 WorkerW,它在现有 WorkerW 之上绘制,所以有吗有什么方法可以让新的 WorkerW 句柄在我的窗口后面绘制,或者使我的新 WorkerW 的子窗口非常快,以便在我的窗口上绘制不明显?

https://youtu.be/N4XC7VLpPi0

:: 应用莱米的方法后 -> enter image description here

[编辑2:]

我设法将窗口放置在 SHELLDLL 视图内和桌面图标顶部(即列表视图)[GLFW30 命名为其中之一]

enter image description here

重现:

  1. 从任何应用程序获取窗口句柄。

  2. 打开Spy++并找到SHELLDLL视图的窗口句柄并将其从十六进制转换为十进制,然后将其传递到SetParent(windowHWND, targetHWND)中。

  3. SetWindowPos 将listView32窗口句柄作为hwndInsertAfter参数传递,然后运行程序,我们当前的窗口将被放置在listview32的下方 enter image description here

但可悲的是,listview32 覆盖了我窗口的所有背景绘画,只显示当前的 Windows 壁纸:(

enter image description here

c++ winapi dwm
1个回答
0
投票

我观察到类似的现象:在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。

© www.soinside.com 2019 - 2024. All rights reserved.