Declaring high DPI awareness per window on Windows 8

时光怂恿深爱的人放手 提交于 2019-12-17 16:26:50

问题


I'm developing audio plugins that run within a host such as Cubase, and I'm looking to add High DPI support. This is problematic because all host applications that I know of declare themselves as non-high DPI aware, so all windows are scaled automatically by the DWM. I'm looking for a way to turn off DWM DPI scaling for the plugin window, even if the host itself is not DPI-aware (so it uses DWM DPI scaling for all other windows). Does anyone know if this is possible at all?

For applications that use a lot of plugins, such as audio hosts, this is a very real problem because they can't just go ahead and declare themselves as high-DPI aware: this would break all existing plugins. So unless Windows provides a solution for this, we're always stuck in 96 dpi land. Basically I think we need a solution that is more fine-grained than setting this per-process, so the host and plugins can individually declare their awareness level.

In case this currently can't be done, is there a way to contact a Microsoft engineer so it could be added to a future version of Windows?


回答1:


Per window DPI awareness is now possible, since Windows 10 anniversary update. A new API SetThreadDpiAwarenessContext() can be used to set per window,and per thread DPI awareness. This is accomplished as follows.

  • A thread can now dynamically change its DPI awarensss.
  • DPI awareness of a window created by the thread will depend on the DPI awareness of the calling thread at the time windows was created.
  • When windows procedure for a window is called, the thread is automatically switched to the DPI awareness context that was in use when the window was created.

Read the following references.

  • https://msdn.microsoft.com/en-us/library/windows/desktop/mt744321(v=vs.85).aspx
  • https://github.com/Microsoft/Windows-classic-samples/.../DPIAwarenessPerWindow/
  • (Read the Readme file) https://github.com/Microsoft/Windows-classic-samples/tree/96f883e4c900948e39660ec14a200a5164a3c7b7/Samples/DPIAwarenessPerWindow



回答2:


You are out of luck here. DPI awareness is a process wide setting. In Windows 8.1 you can declare the process to be DPI aware on a per monitor basis.

And as Raymond comments above, no amount of engineering would enable API functions like GetCursorPos to have per-window DPI awareness, since such functions are not passed windows.



来源:https://stackoverflow.com/questions/26647908/declaring-high-dpi-awareness-per-window-on-windows-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!