屏幕缩放已经提高,窗口DPI却仍读到96,并不直接等于缩放没有生效。GetDpiForWindow的返回值取决于目标窗口的DPI awareness:UNAWARE返回96,SYSTEM_AWARE返回系统DPI,PER_MONITOR_AWARE返回窗口所在显示器DPI;传入无效hwnd则返回0。把96当成监视器缩放失败、物理DPI或刷新率数值,都会把排查方向带偏。该判断适用于Windows 10 1607起的桌面API,且要先确认调用的是真实目标窗口、调用成功,再谈读数含义。

适用条件要先说清。这个API从Windows 10 1607起可用,讨论对象是桌面窗口;它返回的是与窗口DPI awareness相关的DPI值,不是显示器物理DPI,也不是刷新率。
观察时先别急着改设置。第一,确认hwnd是不是真正要检查的窗口,核对是否误取了其他桌面或子窗口,以及句柄是否已失效或参数传错;无效hwnd返回0,和96是两回事。第二,确认目标窗口的DPI awareness。若为DPI_AWARENESS_UNAWARE,返回96是API定义下的结果,说明该窗口按unaware语义处理,不代表监视器缩放没生效。第三,若为SYSTEM_AWARE,读到的是系统DPI,不能直接当作窗口所在显示器的每监视器DPI;若为PER_MONITOR_AWARE,才按窗口所在显示器DPI返回,这时要核对窗口是否确实位于目标显示器、是否在DPI变化后重新读取。第四,把系统显示设置中的缩放比例、窗口实际渲染大小和返回值放在一起看,不要用96反推物理DPI或刷新率。
风险边界也要明确。只凭一个96就修改生产程序的manifest,或临时改全局缩放“凑”出期望值,可能改变窗口布局、坐标换算、字体和命中区域,带来兼容性问题;不能预先承诺改aware模式没有兼容问题。另一个风险是把无效句柄的0忽略掉,或者把系统DPI误当成窗口所在显示器DPI,导致后续判断连锁出错。
下一步可以按分支处理:先复现并记录目标窗口句柄、进程名、awareness、系统缩放、返回值以及调用是否成功。若返回96且awareness为UNAWARE,先判断应用是否本就按unaware设计,再评估是否需要改变渲染策略;若为SYSTEM_AWARE,核对系统DPI与窗口所在显示器是否一致;若为PER_MONITOR_AWARE,核对窗口所在显示器及DPI变化后的读取时机;若返回0,先修正窗口句柄和调用条件。确需调整awareness时,放在测试环境单独验证兼容性,不在生产环境临时改manifest或全局缩放。
宛城区台式电脑用户可拨400-877-9605,先整理实际目标窗口、窗口awareness、系统缩放和API读数。电脑快修网提供信息展示与第三方维修对接,具体地址、电脑侧检查是否支持及安排需当次核实,启用范围不代表即时履约。