前几天,手欠,用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;
}
}