本帖最后由 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 
 
小小的总结,和大家分享。 
 
 
 
 |