Windows唤醒后窗口位移至左上角且尺寸缩小解决方案

自从回家换回2k显示器,每次睡眠后唤醒时所有打开的窗口都会跑到左上角,而且尺寸变得只有原来的一半大,诡异的是这些窗口还是最大化状态,而本案的罪魁祸首就是DP的热插拔检测(Hot Plug Detection)

简单粗暴的解决方案

前排提示,修改注册表有风险,请谨慎操作

太长不看版,按下WIN+R,输入regedit后回车,打开注册表编辑器,定位到

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers

这里我忘记截图了,用另一条电脑的截图来凑个数,总之你会在下面这三条里看到很多记录,记录的是曾经连接过的显示器的相关设置,如下图所示

1
2
3
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\ScaleFactors

拉来凑数的.png

把这三个里面的记录全部删掉然后重启,重启后Windows会重新识别现在连接的显示器,如下图所示
新的.png

一般到这里问题就解决了,重启下显示器或者睡眠唤醒一下检测一下。如果你的电脑问题依旧的话,尝试关闭显示器开关再打开,然后刷新一下注册表编辑器,可以看到Configuration下面多了一项NOEDIDxxxxxxx,修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\NOEDIDxxxxxxx\00中的PrimSurfSize.cxPrimSurfSize.cy的值为当前显示器的分辨率,注意这个00下面还有一个00,里面的也要改。
再来一张.png

解决方案来源1:Stefan Traistaru
解决方案来源2:atwitsend42

如果想要知道原因的话请继续向下看

原理

热插拔

大多数现代显示器的一个方便的特点是能够在两者都通电的情况下 “热插拔 “到源设备上,并立即以正确的显示设置开始工作。

这种行为是由三个功能实现的。热插拔检测、显示数据通道(DDC)和扩展显示识别数据(EDID)。

热插拔检测

将显示器 “热插拔 “到信号源中,意味着在两个设备都通电的情况下进行连接。这与旧技术不同,旧技术通常需要在一个或两个设备断电的情况下进行 “冷插”。热插拔检测或 “HPD “是HDMI、DisplayPort和DVI规格的一项功能。通常情况下,它依赖于连接器中的一个针脚进行接触,从而启动该过程。

DDC

DDC,即显示数据通道,描述了信号源和显示器用于通信的协议和物理路径。它通常被分配给接口上的一个或多个引脚,并携带EDID。

DisplayPort使用一个多功能的 “AUX通道”,而不是一个专门的DDC,它既是用户数据的媒介(通常是USB),也是传输EDID和其他拓扑信息的手段。

EDID

EDID(扩展显示识别数据)是由显示器提供的信息,用于向源设备描述其能力和要求。它包含诸如制造商、序列号、最大分辨率、刷新率和色彩空间等信息。

罪魁祸首

在显示器关闭或进入睡眠状态时,它将通过DCC传输一个信号,表明它正在关闭电源,在某些情况下,这被系统的视频驱动程序或操作系统解释为显示器被拔掉。这将导致操作系统以一种不理想的方式重新安排桌面空间和窗口。

来源:Hot Plug Detection, DDC, and EDID

以我的显示器为例,原分辨率为2560x1440,但是显示器关闭后,系统认为显示器被拔出,检测不到显示器的话系统就会采用注册表中的默认分辨率,也就是上面提到的那个NOEDIDxxxxxxx,在我这里是1024x768,当显示器再次开启时,会听到很多声硬件插拔的提示音,说明显示器被当作了新插入的设备,显示器开启后所有的窗口的分辨率并没有改变,仍然是1024x768,观感上就是占了屏幕大小的一半。而Windows窗口的屏幕坐标原点就是在左上角,也就导致所有的窗口都挤在了左上角。

NOEDID

NOEDID的意思就是No EDID,如果系统无法从显示器获取扩展显示识别数据的话,就会调用这个配置。这个文件在显示器关闭或者拔出后会自动生成。

其他解决方案

降低刷新率

很难想象这个办法居然是戴尔官网的文章给出的,涉及的显示器有UP3214Q, P2715Q, P2415Q等,这个荒谬的解决方案是让我们把显示器的刷新率从60Hz下调到30Hz,这篇文章的发布日期是2021年,2021年30Hz的刷新率能干啥呢,转下滚轮都卡的好吧

来源:Display Windows Move or Resize After Resuming from Sleep State

换用HDMI接口

毕竟这是DP独有的问题,换上HDMI自然就解决了嘛🐶

调节显示器热插拔检测设置

在显示器OSD菜单中将DP Hot-Plug Detection设置为Always Active。但是这个办法不适用于所有显示器,只有部分显示器才有这个功能。

来源:Windows are resized and moved to upper-left corner of screen when monitor wakes up from sleep [SOLVED, ON MY SYSTEM]

加密狗

在显示器和主机之间加一个加密狗来欺骗主机,但是要加钱。

历史-摆烂

其实类似的问题在2010年就出现了,当时有人在英伟达的reddit社区发过讨论,但是十几年过去了,无论是巨硬、英伟达、AMD还是英特尔都在摆烂,没有一个人出来解决这个问题。有人曾经给VESA(视频电子标准协会)发过邮件,但是VESA表示他们知道这个问题,但是这个问题应该由显示器制造商解决,而不是他们,就甩锅呗。

最初的讨论

画了个表情包送给它们🐶

摆烂.webp