飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 594|回复: 6

[原创] 软件无夜间模式的功能修改示例

[复制链接]

该用户从未签到

发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 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

小小的总结,和大家分享。



评分

参与人数 1威望 +2 飘云币 +2 收起 理由
qubonn + 2 + 2 多谢分享!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-13 16:39
  • 签到天数: 220 天

    [LV.7]常住居民III

    发表于 4 天前 | 显示全部楼层
    学习了,谢谢楼主!!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2025-1-14 22:42
  • 签到天数: 1226 天

    [LV.10]以坛为家III

    发表于 4 天前 | 显示全部楼层
    感谢楼主分享!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:38
  • 签到天数: 538 天

    [LV.9]以坛为家II

    发表于 3 天前 来自手机 | 显示全部楼层
    大佬往往都是自己动手丰衣足食
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-1-14 08:19
  • 签到天数: 325 天

    [LV.8]以坛为家I

    发表于 前天 09:15 | 显示全部楼层
    感谢楼主分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-1-13 09:04
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 前天 11:12 | 显示全部楼层
    PYG20周年生日快乐!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表