IsProcessDPIAware始终返回true

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IsProcessDPIAware始终返回true相关的知识,希望对你有一定的参考价值。

在Visual Studio 2005中创建的默认未修改项目中运行以下内容会在vista和windows 7中显示“是”消息框。有人知道原因吗? IsProcessDPIAware在这里描述:http://msdn.microsoft.com/en-us/library/aa969261(VS.85).aspx

HMODULE hUser32 = LoadLibrary(L"user32.dll");
typedef BOOL (*fnPtr)();
fnPtr IsProcessDPIAware = (fnPtr)GetProcAddress(hUser32, "IsProcessDPIAware");
if(IsProcessDPIAware) {
    if(IsProcessDPIAware() == TRUE) {
        MessageBox(NULL, L"yes", NULL, MB_OK);
    }
    else {
        MessageBox(NULL, L"no", NULL, MB_OK);
    }
}
else {
    MessageBox(NULL, L"no fn", NULL, MB_OK);
}
FreeLibrary(hUser32);

我在vmware中运行vista和windows 7,如果这很重要的话。

答案

您的Vista或Windows 7系统是否启用了DPI虚拟化?我不确定,但这可能是IsProcessDPIAware返回TRUE的原因。 http://msdn.microsoft.com/en-us/library/dd464660.aspx#setting_dpi_by_using_control_panel

另一答案

无论清单如何,有三种情况会迫使Windows 7中的DPI感知:

  • 全局禁用DPI虚拟化(“使用Windows XP样式DPI缩放”设置)
  • 当前桌面禁用桌面合成(选择非Aero主题或不可用的硬件加速,请注意这意味着在HyperV VM中运行时DPI感知始终处于打开状态!)。
  • 在兼容性设置中禁用显示缩放。

请注意,其他任何兼容性设置都不会更改此设置。选择禁用桌面组合将在初始化进程时禁用桌面组合,但在检查强制DPI意识之后,导致启动多个实例将导致第一个实例没有强制DPI感知,但后续具​​有。

通过在TEB-> Win32ClientInfo.CI_flags中设置标志0x20000000来强制DPI感知。这是在win32k初始化的!SetAppCompatFlags将在gdi32.dll调用NtGdiInit时调用(此初始化在运行进程入口点之前执行)。请注意,在较新版本的Windows 7上,此标志仅在64位版本的TEB中设置。

win32k中的实际代码!SetAppCompatFlags看起来像

if ( (&threadInfo->dwCompatFlags2 & 0x10000000) || !IsCurrentDesktopComposed() || gbForceDPIAware )
{
  w32ProcessInfo = PsGetCurrentProcessWin32Process();
  w32ProcessInfo->W32PF_Flags |= 0x20000000;
  threadInfo->pClientInfo->CI_flags |= 0x20000000;
}

以上是关于IsProcessDPIAware始终返回true的主要内容,如果未能解决你的问题,请参考以下文章

登录身份验证始终返回 true

Firebase Realtime Web 始终返回 True 到 snapshot.exists()

使用 jQuery 进行 MVC 手动表单验证始终返回 True

带有 inJustDecodeBounds=true 的 BitmapFactory.decodeStream 始终返回 100x100

在 C# 中从 C++ .DLL 加载值始终返回 true

即使从“未优化的应用程序”中删除 PowerManager.isIgnoringBatteryOptimizations 也始终返回 true