24H2动态壁纸无法正常嵌入(针对vb.net的紧急加更)

这个24H2已经有了好长时间了,为什么到25年下半年才被我发现,那是因为没有24H2版本的电脑啊!

之前那个台式机不知为何不能更新到24H2,而大家对于24H2桌面壁纸异常的问题也都得到了解决,这一次可能有些仓促,我直接给出讲核心代码

参考文献:

实现桌面动态壁纸(一)_动态壁纸原理-CSDN博客

这个博主专门研究了24H2版本壁纸和Progman的WorkerW问题,我按照ta的思路写了VB.net版本的代码,目前仍在测试阶段,代码为测试代码,已经较为完善,需要根据需要修改!

最值得注意的就是,设置窗口为不透明,根据需要加,最好加上去!

vbnet 复制代码
SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA)
vbnet 复制代码
Public BackLo As Point
Dim sendMessageBack As IntPtr
Const GWL_EXSTYLE As Integer = -20
Const WS_EX_LAYERED = &H80000
Public Const LWA_ALPHA As Integer = &H2
Const HWND_BOTTOM = 1
Const HWND_TOP = 0
Const SWP_NOMOVE = &H2
Const SWP_NOSIZE = &H1
Const SWP_NOACTIVATE = &H10
Const SW_SHOW = 5
Const WS_EX_NOACTIVATE = &H8000000L

Declare Auto Function GetWindowLong Lib "user32" (ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
Declare Auto Function SetWindowLong Lib "user32" (ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


    BackPalyer.Show()
    Dim hWnd = BackPalyer.Handle
    '24H2
    Dim ProgmanPtr = FindWindow("Progman", Nothing)
    Dim WorkerW As IntPtr
    '激活WorkerW
    SendMessageTimeout(ProgmanPtr, &H52C, IntPtr.Zero, IntPtr.Zero, 0, &H3E8, sendMessageBack)
    '查找子窗口获得句柄
    WorkerW = FindWindowEx(ProgmanPtr, IntPtr.Zero, "WorkerW", Nothing)

    Dim DefView As IntPtr
    DefView = FindWindowEx(ProgmanPtr, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
    ' 获取窗口当前的扩展样式
    Dim extendedStyle As Integer = GetWindowLong(hWnd, GWL_EXSTYLE)
    ' 设置新的扩展样式,增加分层样式
SetWindowLong(hWnd, GWL_EXSTYLE, extendedStyle Or WS_EX_LAYERED Or WS_EX_NOACTIVATE)

    'SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA)
    '嵌入progman
    SetParent(hWnd, ProgmanPtr)

    '调整Z序
    'player
    SetWindowPos(hWnd, HWND_TOP, 0, 0, 500, 500, 0)
    'SHELLDLL_DefView 桌面图标窗口

    SetWindowPos(DefView, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE)
    'WorkerW

    SetWindowPos(WorkerW, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE)

    ShowWindow(hWnd, SW_SHOW)
    ShowWindow(DefView, SW_SHOW)
    ShowWindow(WorkerW, SW_SHOW)
  End Sub

Public Shared Function RefreshBack() As Boolean
    Dim wallpaper As New StringBuilder(200)
    SystemParametersInfo(&H73, 200, wallpaper, 0)
    Dim returnValue As Integer = SystemParametersInfo(20, 1, wallpaper, 3)
    If returnValue <> 0 Then
        Dim currentUserRegistry As RegistryKey = Registry.CurrentUser
        Dim desktopRegistry As RegistryKey = currentUserRegistry.CreateSubKey("Control Panel\Desktop\")
        desktopRegistry.SetValue("Wallpaper", wallpaper.ToString())
        Return True
    End If
    Return False
End Function

Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    BackPalyer.Close()
    RefreshBack()
End Sub

效果:

系统版本号暂时为 纯正24H2------26100.1

注意:测试过程中,如果在Player窗口处于焦点状态,那么可能会改变Progman窗口的Z序,解决方法就是嵌入进去就把焦点失去给到别的窗口

vbnet 复制代码
' 设置新的扩展样式,增加分层样式
SetWindowLong(hWnd, GWL_EXSTYLE, extendedStyle Or WS_EX_LAYERED Or WS_EX_NOACTIVATE)
相关推荐
Shadow(⊙o⊙)18 小时前
Bug调试1.0
bug
T01156182 天前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
zone_z2 天前
07 · 等待事件与 OWI 方法:从 OSW 到 BUG 的完整破案实录
linux·数据库·oracle·ffmpeg·bug·troubleshooting
黑猫学长呀3 天前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
姚青&3 天前
测试流程搭建
测试用例·bug·jira
mmsx3 天前
return false 不是拦截:一次按键触发两个动作的事件冒泡陷阱
android·bug
随风丶飘4 天前
[特殊字符] 告别“update“和“fix bug“——Smart Git Commit LLM 让 AI 帮你写专业的 Git 提交信息
人工智能·git·bug
czhc11400756634 天前
崩溃复查与“回声“bug:异常码判案、漏网之鱼和耳塞开关
bug
mmsx6 天前
我明明调用了 zoomToBounds,地图却总是停在别处?延迟加到 5 秒也没用,真相只有一个
android·人工智能·bug·地图
mmsx6 天前
置灰按钮为什么自己又“亮“了?一次状态缓存“双写冲突“的排查记录
java·缓存·bug·livedata