软件无夜间模式的功能修改示例

查看 29|回复 3
作者:qqycra   
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
小小的总结,和大家分享。

软件, 代码

qqycra
OP
  

这是种思路,挺简单的,不光能修改背景色,说白了劫持了,你想改什么看你自己
pojieA0321A   

收藏了,感谢分享!
wari01   

感谢分享,拿走研究研究
您需要登录后才可以回帖 登录 | 立即注册

返回顶部