捕获外接显示器连接事件:Windows与macOS系统消息问询
Windows 和 macOS 外接显示器连接/移除时的系统消息说明
Windows 系统
- 当外接显示器连接、移除,或是显示配置(比如主显示器切换、分辨率/DPI变更)变动时,系统会给所有顶层窗口发送
WM_DISPLAYCHANGE消息,消息里会附带新的分辨率、颜色深度等显示参数。 - 对应你提到的两个场景:
- 本地显示器启动程序退出后,连接第二台显示器设为主显示器:后续启动程序时,程序可以通过初始化时查询当前显示配置,或者监听
WM_DISPLAYCHANGE消息来适配新主显示器的参数。 - 外接显示器启动应用关闭后,移除显示器再在小尺寸/DPI的本地显示器启动程序:程序启动时会读取当前屏幕的配置信息,要是程序做了适配逻辑,会自动调整UI;如果之前的应用保存过窗口位置,可能需要通过
WM_DISPLAYCHANGE修正位置,避免窗口超出屏幕范围。
- 本地显示器启动程序退出后,连接第二台显示器设为主显示器:后续启动程序时,程序可以通过初始化时查询当前显示配置,或者监听
- 另外,Windows 10及以上版本针对DPI变化,还会发送
WM_DPICHANGED消息,专门通知窗口DPI变更,方便程序调整UI缩放比例。
macOS 系统
- macOS 在显示器连接、移除或显示配置变更时,会通过Notification Center发送
NSApplicationDidChangeScreenParametersNotification通知,只要应用注册了这个通知就能收到。 - 同时,AppKit框架下的窗口会自动触发
windowDidChangeScreen(_:)委托方法,用来处理屏幕变更事件。 - 对应你的场景:
- 切换主显示器后启动程序:程序启动时会获取当前主屏幕的尺寸、DPI等参数,支持适配的程序会自动调整UI;如果之前保存过窗口状态,也可以通过监听上述通知来修正窗口的位置和大小。
- 移除外接显示器后在本地小屏幕启动程序:程序初始化时会读取当前屏幕的配置,要是有屏幕变更处理逻辑,会自动适配小尺寸/DPI的屏幕,避免UI错位或者超出显示范围。
- 要是用SwiftUI开发应用,可以通过
@Environment(\.screen)或者监听NSApplication.didChangeScreenParametersNotification来响应屏幕变化。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

