当“由应用程序执行缩放”时未收到WM_DPICHANGED

我在Windows 10(1703)下的两个不同DPI的显示器上运行一个程序(称为prog.exe)。 该计划包含:

SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); CreateWindow(....); 

prog.exe清单不包含任何引用

 <dpiAware>...</dpiAware> 

如果prog.exe – >属性 – >兼容性 – >“覆盖高DPI缩放”未选中,则窗口从监视器移到另一个时会收到WM_DPICHANGED,prog.exe可以重新缩放它。 现在,如果选中“Override High DPI Scaling”并将其设置为“由应用程序执行的缩放”,窗口不再接收WM_DPICHANGED(用spy ++确认),所以prog.exe不知道何时需要重新调整它。 这看起来很奇怪:当应用程序执行缩放时,应用程序应该被警告DPI更改! 我的问题的解决scheme可能是简单的:保留“重写高DPI缩放”取消选中,但事情更多:prog.exe(Override High DPI scaling now取消选中)是由xemacs(通过comint)作为subprocess启动的,唯一的让xemacs文本unblurry的方法是将它的兼容性设置为“通过应用程序执行缩放”。 但是它的subprocessprog.exe被认为是PROCESS_PER_MONITOR_DPI_AWARE(由processExplorer确认,并且通过在prog.exe中显示GetProcessDpiAwareness的结果)。 与“覆盖高DPI缩放比例”一样时也是如此。 我也尝试用SetProcessDpiAwareness或SetProcessDpiAwarenessContext来重置prog.exe的dpi意识,但是我得到了一个“访问被拒绝”的错误:合乎逻辑,因为MSDN表示,一旦设置了进程的dpi意识,以后就不能改变。 问题是:如何推出prog.exe与“新鲜的”DPI意识,而不是从其父进程inheritance?