【问题标题】:How can I CreateProcess with DPI awareness set to DPI_AWARENESS_CONTEXT_UNAWARE如何将 DPI 感知设置为 DPI_AWARENESS_CONTEXT_UNAWARE 的 CreateProcess
【发布时间】:2019-01-30 21:18:07
【问题描述】:

我有 C++ 应用程序,它在 Windows 10 上使用 CreateProcessA 打开其他应用程序。这些应用程序可能有不同的 DPI 感知设置。

所以问题是 - 我可以创建将 DPI Awareness 设置为 DPI_AWARENESS_CONTEXT_UNAWARE 的进程吗?

如果没有 - 那么也许我可以为已经创建的进程设置DPI_AWARENESS_CONTEXT_UNAWARE?

统一更新: 我的应用程序生成应用程序,然后改变一个人的位置。如果它看起来是另一台具有不同 DPI 的显示器,则会提供缩放值。

如果应用支持 DPI,则在移动完成后,尺寸会根据 WM_DPICHANGED 消息值更改。衍生的应用程序可能具有不同的 DPI 感知模式。所以想法是为它们设置一种模式,并以相同的逻辑控制所有它们的位置和尺寸。

【问题讨论】:

  • 您的问题不清楚。 DPI 意识不是从启动过程中继承的。您的进程启动的应用程序的 DPI 意识将设置为这些应用程序想要的任何内容。这不是你应该关心或尝试改变的事情。
  • 您好 htonus,问题解决了吗here:在应用程序中检测辅助显示器的分辨率?

标签: c++ winapi createprocess highdpi


【解决方案1】:

如果应用还没有清单,您可以使用SetProcessDpiAwarenessContext 设置感知。还要检查this。

除非使用CreateRemoteThread 注入远程线程,否则您无法在现有应用上设置感知,在这种情况下,当强制执行某些应用不知道的事情时,您可能会导致不兼容。

【讨论】:

  • CreateRemoteThread 将不起作用,因为应在创建目标进程的第一个窗口之前调用 SetProcessDpiAwarenessContext。我遇到的问题是,当我的应用程序为具有适当尺寸(缩放)的进程发送 SetWindowPos 并且该进程是 DPIawared 时,它会设法通过 WM_DPICHANGED 消息更新尺寸。
  • SetProcessDpiAwarenessContext() 只对调用进程进行操作,不能用于为其他进程设置 dpi 感知。
  • @htonus 你为什么要操作另一个进程的窗口?你到底想完成什么?
  • @RemyLebeau 谁说这个函数可以在不同的进程上运行?
  • @Michael 它不能,这就是重点。但是OP的问题暗示他想改变另一个进程的DPI设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多