Conversation
- 窗口创建后按 ICO 内嵌帧设置 WM_SETICON(16/32),不再使用默认程序图标 - 深色模式下用 DwmSetWindowAttribute(DWMWA_USE_IMMERSIVE_DARK_MODE) 让右上角按钮可见 - xmake: 链接 dwmapi,并通过 utils.bin2c 把 resources/injector.ico 编入只读数据
运行 breeze.exe 弹出的那个注入器窗口,标题栏图标仍是 Windows 通用程序图标, 深色主题下右上角最小化/最大化/关闭三个按钮是黑的、跟背景糊在一起。 两个原因: - GLFW 注册窗口类时按名字去 exe 资源里找 "GLFW_ICON" (breeze-glfw/src/win32_window.c),找不到就退回 IDI_APPLICATION; 而 src/inject/inject.rc 里图标组的名字实际是 "IDI_APP_ICON",两边对不上。 - GLFW 不会开启沉浸式深色标题栏,DWM 按浅色渲染标题栏, 于是深色主题下按钮和文字是黑的。 修法与 shell 侧(binding_types_breeze_ui.cc)保持一致:窗口建好后用 WM_SETICON 补上大小图标、用 DwmSetWindowAttribute 开沉浸式深色标题栏 (属性 20,失败回退 19)。StartInjectUI 和 ShowCrashDialog 两个窗口都处理。 xmake.lua 给 inject 目标补上 dwmapi。 shell.dll 那边的配置页窗口走 breeze_ui::window::create_ex,上一版已修,本次不动。
Owner
|
感谢 @Z2549 的详细排查!根因分析(GLFW_ICON 名字对不上、GLFW 不开沉浸式深色标题栏)都很准确。 不过这两个问题本质上是 breeze-ui 的
这个 PR 就先关掉了,再次感谢! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题
有两处原生标题栏显示不正确,而且分属两条不同的代码路径:
breeze.exe后弹出的那个置顶窗口breeze_ui.window.create打开的设置界面,同样这两个问题根因
图标
breeze-glfw/src/win32_window.c注册窗口类时是按名字去 exe 资源里取图标的:但仓库里没有任何名为
GLFW_ICON的资源:src/inject/inject.rc用的是IDI_APP_ICON(这个标识符在 WinUser.h 里并没有定义,rc.exe 会把它当字符串名处理)。
解析产物资源表可以看到组名确实是字符串:
名字对不上 ⇒ 永远走
IDI_APPLICATION这条 fallback。另外 GLFW 也没有设置wc.hIconSm,小图标尺寸是错的。
三个按钮发黑
GLFW 不会开启沉浸式深色标题栏,DWM 按浅色渲染标题栏,于是深色主题下
最小化/最大化/关闭按钮和标题文字都画成深色,跟深色背景糊在一起。
改动
src/shell/script/binding_types_breeze_ui.ccbreeze_ui::window::create_ex建好窗口后补图标与深色标题栏(配置页窗口)src/inject/inject.ccStartInjectUI()和ShowCrashDialog()(注入器窗口)xmake.luashell目标补dwmapi与 ico 的utils.bin2c规则;inject目标补dwmapi具体做法:
resources/injector.ico取帧 —— shell 侧逐帧解析ICONDIR/RT_ICONblob后用
CreateIconFromResourceEx造 HICON;inject 侧用LoadImageW按资源真名取。再用
WM_SETICON设ICON_SMALL(16) /ICON_BIG(32);HICON 做成进程内共享、不 DestroyIcon。DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, ...),失败回退到属性 19(Win10 20H1 之前),是否用深色跟随系统
AppsUseLightTheme。没有改
inject.rc:把资源名改成GLFW_ICON也能让 GLFW 自己找到图标,但字符串名资源可能影响资源管理器里 exe 图标的选取,风险不确定;用
WM_SETICON覆盖窗口图标是零风险的。验证
肉眼:启动
breeze.exe,置顶窗口左上角应是 breeze 图标、深色下三个按钮清晰;配置页窗口同样。不依赖肉眼的 PE 层面自检(在构建产物上实测):
breeze.exe里FindResource(RT_GROUP_ICON, "IDI_APP_ICON")非空,"GLFW_ICON"为空;LoadImageW在 16/32 两个尺寸上都能取到 HICON —— 同时证明「修复有效」和「根因成立」advapi32.dll!RegGetValueW(深色判断用),无符号消失"IDI_APP_ICON"出现在.rdata(代码字面量)和.rsrc(资源名)两处备注:关于本仓库 master 的 CI
master 的 CI 自 2026-06-04 起一直是红的,与本 PR 无关。根因是依赖版本漂移:
breeze-ui的xmake.lua里add_requires("glad")没有钉版本,xmake-repo 现在会解析到glad v2.0.8,而 glad 2.x 只提供
<glad/gl.h>,代码 include 的是 0.1.x 布局的<glad/glad.h>,于是
install breeze-nanosvg会失败在:本地是在
deps/breeze-ui.lua里给breeze-nanosvg/breeze-nanovg/breeze-ui钉回
glad 0.1.36(通过add_patches改 breeze-ui 的add_requires,再补add_deps)之后才构建出产物的。这个构建修复没有包含在本 PR 里,以免把无关改动掺进来;
如果需要,我可以单独开一个 PR 处理。