qqycra 发表于 2025-6-1 20:02:42

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

本帖最后由 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 添加如下函数(我只是举例子,代码不完善,实际使用要考虑全面)
void doFR(DWORD Memory, LPCSTR RData) {
      HMODULE hModule = GetModuleHandle(NULL);
      LPVOID lpBaseAddress = (LPVOID)((DWORD_PTR)hModule + Memory);

      char RRData = { 0 };
      int len = (int)strlen(RData);

      // 反转字符串并每两位取一次
      for (int i = len; i >= 2; i -= 2) {
                StringCchCatA(RRData, 256, RData + i - 2);
                RRData = '\0'; // 确保以NULL结尾
      }

      SIZE_T nSize = strlen(RRData) / 2;
      DWORD lpBuffer = strtoul(RRData, NULL, 16);
      WriteProcessMemory(GetCurrentProcess(), lpBaseAddress, &lpBuffer, nSize, NULL);
}


然后在 DLL_PROCESS_ATTACH 下再添加如下代码(我只是举例子,代码不完善,实际使用要考虑全面):
#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

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



jinyudz 发表于 2025-6-1 20:35:12

学习了,谢谢楼主!!

xyzjxlf 发表于 2025-6-1 21:50:31

感谢楼主分享!

benboba 发表于 2025-6-2 13:23:40

大佬往往都是自己动手丰衣足食

super_king 发表于 2025-6-3 09:15:56

感谢楼主分享

chchhau 发表于 2025-6-3 11:12:42

PYG20周年生日快乐!

乐活 发表于 2025-6-5 09:46:00

太厉害了!

ynb168c 发表于 2025-6-6 09:03:10

感谢楼主分享!

杨林 发表于 2025-6-7 22:36:39

感谢分享,学习了!
页: [1]
查看完整版本: 软件无夜间模式的功能修改示例