本帖最后由 qqycra 于 2025-6-1 20:15 编辑
IceDesign 是 PureBasic IDE 的窗体设计器的完美替代软件,
但是在windows 10 系统上,如果系统切换到深色模式后,他白花花的背景很刺眼,
我们的目标是让软件启动时能根据注册表的 Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize 下的
AppsUseLightTheme 等值自动修改软件的背景色。
1、首先,动态调试找到软件颜色配置,确定要修改的特征
IceDesign 设置 黑色 背景色的 1337 文件为:
>icedesign.exe
000000000003DB67:89->C7
000000000003DB69:4B->47
000000000003DB6D:C7->11
000000000003DB6E:05->11
000000000003DB6F:19->11
000000000003DB70:F7->00
000000000003DB71:35->90
000000000003DB72:00->90
000000000003DB73:6D->90
000000000003DB74:04->90
000000000003DB75:D0->90
000000000003DB76:00->90
IceDesign 设置 白色 背景色的 1337 文件为:
>icedesign.exe
000000000003DB67:89->C7
000000000003DB69:4B->47
000000000003DB6D:C7->FF
000000000003DB6E:05->FF
000000000003DB6F:19->FF
000000000003DB70:F7->00
000000000003DB71:35->90
000000000003DB72:00->90
000000000003DB73:6D->90
000000000003DB74:04->90
000000000003DB75:D0->90
000000000003DB76:00->90
2、使用大白的劫持代码生成器生成msimg32.dll x64模板工程,
我们在 msimg32.cpp 添加如下函数(我只是举例子,代码不完善,实际使用要考虑全面)
[C++] 纯文本查看 复制代码 void doFR(DWORD Memory, LPCSTR RData) {
HMODULE hModule = GetModuleHandle(NULL);
LPVOID lpBaseAddress = (LPVOID)((DWORD_PTR)hModule + Memory);
char RRData[256] = { 0 };
int len = (int)strlen(RData);
// 反转字符串并每两位取一次
for (int i = len; i >= 2; i -= 2) {
StringCchCatA(RRData, 256, RData + i - 2);
RRData[strlen(RRData)] = '\0'; // 确保以NULL结尾
}
SIZE_T nSize = strlen(RRData) / 2;
DWORD lpBuffer = strtoul(RRData, NULL, 16);
WriteProcessMemory(GetCurrentProcess(), lpBaseAddress, &lpBuffer, nSize, NULL);
}
然后在 DLL_PROCESS_ATTACH 下再添加如下代码(我只是举例子,代码不完善,实际使用要考虑全面):
[C++] 纯文本查看 复制代码 #define REG_THEME L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"
HKEY hKey = NULL;
if (RegOpenKeyExW(HKEY_CURRENT_USER, REG_THEME, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
DWORD t = 0;
DWORD sz = sizeof(DWORD);
if (RegQueryValueExW(hKey, L"AppsUseLightTheme", NULL, NULL, (LPBYTE)&t, &sz) == ERROR_SUCCESS) {
if (t == 0) {
doFR(0x000000000003DB67, "C7");
doFR(0x000000000003DB69, "47");
doFR(0x000000000003DB6D, "11");
doFR(0x000000000003DB6E, "11");
doFR(0x000000000003DB6F, "11");
doFR(0x000000000003DB70, "00");
doFR(0x000000000003DB71, "90");
doFR(0x000000000003DB72, "90");
doFR(0x000000000003DB73, "90");
doFR(0x000000000003DB74, "90");
doFR(0x000000000003DB75, "90");
doFR(0x000000000003DB76, "90");
}
else
{
doFR(0x000000000003DB67, "C7");
doFR(0x000000000003DB69, "47");
doFR(0x000000000003DB6D, "FF");
doFR(0x000000000003DB6E, "FF");
doFR(0x000000000003DB6F, "FF");
doFR(0x000000000003DB70, "00");
doFR(0x000000000003DB71, "90");
doFR(0x000000000003DB72, "90");
doFR(0x000000000003DB73, "90");
doFR(0x000000000003DB74, "90");
doFR(0x000000000003DB75, "90");
doFR(0x000000000003DB76, "90");
}
}
RegCloseKey(hKey);
}
}
3、把编译的 msimg32.dll 放到 IceDesign.exe 同目录下,启动exe时,软件的背景色会随 AppsUseLightTheme 等值而变。
4、这是个思路,我通过这种方式让 PureBasic IDE 启动时自动切换颜色主题。
5、如果想练手,访问 https://github.com/ChrisRfr/IceDesign 下载 IceDesign.exe
小小的总结,和大家分享。
|