聊聊Win11 24H2 自定义桌面背景

前几天,手欠,用windows升级助手把系统升级到了24H2,结果再进系统,我自己写的自定义桌面程序显示异常。没办法,先把自启动停掉了。

但问题还是要解决,第一个想法就是0x52c失效了。用spy++看了一下,并没有完全失效,但是作用和23H2之前的不一样了。微软是真会玩。

没办法,尝试改变嵌入位置,但效果都不明显。

后面,结合涟幽516大神的文章

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

总算找到了解决的办法。

总体方案和之前的实现方式改动不大,

23H2之前的思路是通过0x52c消息让Program Manager变为3层结果,把我们的程序嵌入Program Manager作为子窗口并隐藏workerw2。

24H2发送0x52c并不会生成3层结构,而是在Program Manager下生成一个workerw,解决的思路就是在我们的程序窗口的扩展式样追加分层式样,并把变成workerw的子窗口。

具体代码片段如下:

C:

#include "stdio.h"
#include "stdlib.h"
#include "Windows.h"

DWORD processId = 0;
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM IParam)
{
    HWND hDefView = FindWindowEx(hwnd, 0, "SHELLDLL_DefView", 0);
    if (hDefView != NULL) {
        HWND hWorkerw = FindWindowEx(hwnd, hDefView, "WorkerW", 0);
        //获取窗口的句柄
        HWND hAppHwnd = FindWindow(0, "CountDownApp");
        //获取窗口扩展式样
        LONG nExStyle = GetWindowLong(hAppHwnd, GWL_EXSTYLE);
        //窗口扩展式样添加分层
        nExStyle |= WS_EX_LAYERED;
        LONG setResult = SetWindowLong(hAppHwnd, GWL_EXSTYLE, nExStyle);
        //刷新窗口,让式样立即生效
        UpdateWindow(hAppHwnd);
        ShowWindow(hAppHwnd, 5);
        //窗口设置为桌面窗口的子窗口
        HWND preHwnd = SetParent(hAppHwnd, hwnd);
        return FALSE;
    }
    return TRUE;
}

int main()
{
    STARTUPINFO si = { 0 };
    si.wShowWindow = TRUE;
    PROCESS_INFORMATION pi = { 0 };
    if (CreateProcess("CountDownApp.exe", NULL, 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi))
    {

        processId = pi.dwProcessId;
        printf("ProccessId:%d\n", pi.dwProcessId);
        Sleep(500);
        //获取桌面窗口的句柄
        HWND hProgman = FindWindow("Progman", 0);//发送0x52c消息
        LRESULT result = SendMessage(hProgman, 0x52c, 0, 0);

        EnumWindows(EnumWinProc, SW_HIDE);
    }
    else
    {
    }
    system("pause");
    return 0;
}

C#

        private void BaseForm_Load(object sender, EventArgs e)
        {
            IntPtr hProgman = NativeMethods.FindWindow("Progman", null);
            NativeMethods.SendMessage(hProgman, 0x52c, UIntPtr.Zero, IntPtr.Zero);
            NativeMethods.EnumWindows(EnumWinProc, IntPtr.Zero);
        }
        static bool EnumWinProc(IntPtr hwnd, int IParam)
        {
            IntPtr hDefView = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null);
            if (hDefView != IntPtr.Zero)
            {
                IntPtr hWorkerw = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "WorkerW", null);
                //设置窗体属性
                NativeMethods.SetParent(thisHandle, hWorkerw);
                return false;
            }
            return true;
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams paras = base.CreateParams;
                paras.ExStyle |= 0x02080000;
                return paras;
            }
        }
### 如何将 Windows 11 24H2 版本降级到 22H2 对于操作系统版本的回退,尤其是像 Windows 这样的复杂系统,过程较为严谨。微软官方支持一定条件下的版本回滚,在特定的时间窗口内(通常是更新后的十天),用户可以直接利用系统的恢复选项来实现这一目标。 然而,当超出这个时间范围,则需采取更为复杂的措施: #### 使用备份还原 如果此前创建过系统映像或进行了文件历史记录备份,那么可以通过这些备份来进行整个系统的恢复至之前的版本状态[^1]。 #### 清洁安装旧版Windows 另一种方法涉及完全移除当前的操作系统并重新安装期望的老版本。这一步骤前务必备份重要资料和个人设置。具体操作如下所示: - 下载适用于22H2版本的ISO镜像文件; - 利用媒体创建工具制作启动U盘; - 设置BIOS从USB设备引导进入安装界面; - 按照提示完成新系统的部署流程。 需要注意的是,这种做法可能会清除硬盘上的所有数据,因此提前做好充分准备至关重要。 #### 卸载最近的功能更新 假如升级发生在较短时间内,还可以尝试通过控制面板中的“程序和功能”部分找到相应的更新条目,并执行卸载命令。不过此方式的有效性依赖于具体的环境配置以及所处地区的服务政策差异。 ```powershell Get-WindowsUpdateLog | Select-String "KB" ``` 上述PowerShell脚本可以帮助识别已应用的安全性和质量补丁编号,从而更精准定位待移除的内容项。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿捏利

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值