Repository navigation
WindowMark v0.5.1
三件事在用户眼里都是「WindowMark 不工作了」,根因互不相干。
托盘图标在 explorer 重启后永久消失
现象是「WindowMark 启动不了」:托盘里没有图标,双击 exe 也毫无反应。其实进程一直好好跑着。
explorer 每次重启都会销毁所有托盘图标,然后广播一条 TaskbarCreated 消息让各程序重新加回去 —— WindowMark 从来没接过这条消息,图标于是再也回不来。explorer 重启比想象中常见:改显示配置、ToDesk / 远程桌面接入、它自己崩一次都会。抓到的现场里进程启动时间对得很死:WindowMark 15:15:44,explorer 18:46:53。
双击 exe 没反应是第二重。 单例检查发现已在运行,就给运行中的实例发个消息、自己退出;而那个消息的处理用 NIM_MODIFY 往图标上挂气泡 —— 图标都没了,NIM_MODIFY 直接失败,而且是静默失败。于是用户最可能采取的动作,恰好是唯一走到这条路的时候,却什么都不发生。
现在接上 TaskbarCreated 重新加图标;气泡那条路也不再假设图标存在。
锁屏之后可能永远停在挂起
只认 WTS_SESSION_UNLOCK 一个恢复事件。机器锁过一次,之后走 ToDesk 之类的远程接入,到达的是 WTS_CONSOLE_CONNECT / WTS_REMOTE_CONNECT,UNLOCK 未必来 —— 于是永远停在挂起:进程跑着、消息循环正常、一条边框也不画。
overlays_.Sync() 在挂起判断后面,所以画布尺寸也跟着冻住。抓到的现场:屏幕已经是 1920×1080,画布还停在 1536×864。
改成只有 LOCK 挂起,其余每一个会话事件都恢复。写成「其余一律恢复」而不是逐个列出恢复事件:新的事件类型只会把它推向恢复,不会把它锁死在挂起里。
tools\check-session-resume.py 盯诊断日志里的状态机验证,不盯屏幕像素 —— 锁屏界面或任何全屏窗口盖在上面时边框本来就该一个不画,那时「屏幕上没有边框」根本区分不出挂起和被遮挡。把恢复分支变异回「只认 UNLOCK」,6 个恢复事件里 5 个立刻失败。
边框往窗口里吃 4px
border.width=3、border.offset=-1,按文档窗口内侧该只盖 1px。实测是 2px 在外、4px 在内,整条线 6px —— border.width 说了不算。像素剖面显示 Windows 自己那条灰边已经完全被盖住,4px 里只有约 1px 是压它需要的。
两处合起来造成的:
corner_width_extra 加的是整圈的宽,不只是四个角。 corners 一开,整圈都由一条抗锯齿的弧矩形画出来,独立的直边段根本不存在了。而加宽方向写死了往窗口内侧长。改成往外长,内沿钉在 -offset,加多少宽都不动它。
屏幕夹取按 outer 算,把外扩的部分又裁了回去。 ClampBorderToScreen 返回的 limit 是从传进去的矩形只缩不放的,随后 ClipToBounds 裁掉超出部分 —— 传 outer 等于把长出去的那截原样裁回。改传 paintOuter,判据也从 reach 换成 reach + grow:窗口离任务栏 4px 时按 reach=2 算「没贴上」,可边框实际往外画 5px,照样会压上去。
corner_width_extra 默认也从 3 改成 1 —— 方向变了之后这个数的含义跟着变了,原来那个 3 是按「往内长」逐档试出来的。现在默认是 3px 在外、1px 在内、整条线 4px;设 0 就是严格的 border.width。
RoundedRingOf 抽成 core 的纯函数配测试,6 个变异体全部被抓住。
升级注意:已有的 settings.conf 不会被改写,corner_width_extra 的新默认值只对全新安装生效。想用新值自己改掉那一行,或者跑 rebuild_and_install.bat -Fresh。
安装:下载 WindowMark-v0.5.1-win64.zip,解压后运行 WindowMarkSetup.exe。不想安装就直接跑解压目录里的 WindowMark.exe。
完整变更见 CHANGELOG.md。