Skip to content

fix: 修复副屏任务栏重启后不显示及高度异常问题 - #495

Open
Hsyoungtick wants to merge 1 commit into
Diorser:masterfrom
Hsyoungtick:fix/secondary-monitor-taskbar
Open

fix: 修复副屏任务栏重启后不显示及高度异常问题#495
Hsyoungtick wants to merge 1 commit into
Diorser:masterfrom
Hsyoungtick:fix/secondary-monitor-taskbar

Conversation

@Hsyoungtick

Copy link
Copy Markdown

问题

在多显示器环境下,将任务栏设置到副屏后,每次重启程序都无法在副屏任务栏显示,需要手动切回主屏再切回副屏才能恢复。同时副屏任务栏会占位但内容不可见。

根因

  1. FindHandles fallback 到主屏:启动时副屏任务栏(Shell_SecondaryTrayWnd)可能尚未就绪,原代码会 fallback 到主屏 Shell_TrayWnd,且 Tick 重试逻辑无法检测到这个错误,导致永远停留在主屏。

  2. DPI 缩放导致坐标空间不一致Screen.Bounds 返回物理像素,Screen.WorkingArea 返回逻辑像素,两者相减得到错误的高度(如 424px 而非 40px),导致窗口被拉伸但内容不可见。

修复

  • FindHandles 找不到副屏任务栏时返回 IntPtr.Zero,不再 fallback 到主屏,让 Tick 重试机制生效
  • 新增 IsOnCorrectScreen() 检测当前句柄是否挂载在目标屏幕上
  • Tick 中增加 isWrongScreen 检查,挂载到错误屏幕时触发重新查找
  • 句柄变化时立即重新挂载,解决 Win10 策略缓存过期问题
  • GetTaskbarRect 中当物理矩形高度已是合理任务栏高度(20~100px)时直接使用,绕过 DPI 缩放不一致问题

测试环境

  • Win10 22H2 + 双显示器(主屏 2560×1440 100% / 副屏 1366×768 150%)

- FindHandles 不再 fallback 到主屏,副屏未就绪时返回 Zero 触发重试

- 新增 IsOnCorrectScreen 检测句柄是否挂载在正确屏幕

- Tick 中增加 isWrongScreen 检查,挂载错误屏幕时触发重新查找

- 句柄变化时立即重新挂载,解决 Win10 策略缓存过期问题

- 修复 DPI 缩放导致 Screen.Bounds 与 WorkingArea 坐标空间不一致
@zhguanxian

Copy link
Copy Markdown

求尽快合入

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants