如何默认激活“在高 DPI设置下禁用显示缩放”的功能?

3
我们的应用程序在一些Windows 8.1设备上,特别是高DPI设置(150%或更高)下的一些设备上无法正常工作。具体来说,我们使用CEF托管嵌入式Web浏览器。所有这些嵌入式CEF浏览器都会呈现偏移的元素。
当“在高DPI设置下禁用显示缩放”选中时,该应用程序可以正常工作。但是,默认情况下此选项未被选中。
我该如何确保我的应用程序(基于MFC)默认勾选此设置?
我尝试按照以下帖子中所述,在清单中关闭DPI感知,例如:https://msdn.microsoft.com/en-us/magazine/dn574798.aspxhttp://blogs.msdn.com/b/vcblog/archive/2010/03/11/mfc-applications-now-default-to-being-dpi-aware.aspx。但是,这似乎没有起作用。

2
您必须在清单文件中打开DPI感知。 - Hans Passant
1个回答

2

通过对CEF进行更新,解决了潜在的问题。

然而,在此期间的解决方案(以及这个问题的实际答案,希望对其他人有用)是在我们(WiX)的安装过程中使用自定义操作打开“在高DPI缩放设置上禁用显示缩放”复选框。以下是一些C++代码:

#include "shlwapi.h"

#include <winreg.h>
//
// Include the MSI declarations etc
//  - Also ensure the dll is linked with msi.lib
//
#include <msi.h>
#include <msiquery.h>
#pragma comment(lib, "msi.lib")

UINT __stdcall DisableHighDPIAware(MSIHANDLE hInstaller)
{
    HKEY key;
    DWORD dwDisposition;
    LONG error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCWSTR)L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", 0, NULL, 0, KEY_ALL_ACCESS | KEY_WRITE | KEY_WOW64_64KEY, NULL, &key, &dwDisposition);
    if (error != ERROR_SUCCESS)
    {
        return ERROR_INSTALL_FAILURE;
    }

    wchar_t pathToApp[MAX_PATH];
    DWORD PathSize = sizeof(pathToApp);
    error = MsiGetProperty(hInstaller, L"CustomActionData", pathToApp, &PathSize);
    if (error != ERROR_SUCCESS)
    {
        return ERROR_INSTALL_FAILURE;
    }

    wchar_t* value = L"~ HIGHDPIAWARE";
    PathAppend(pathToApp, L"app.exe");

    error = RegSetValueEx(key, (LPCWSTR)pathToApp, 0, REG_SZ, (const BYTE*)value, (DWORD)(lstrlen(value) + 1)*sizeof(TCHAR));
    if (error != ERROR_SUCCESS)
    {
        return ERROR_INSTALL_FAILURE;
    }

    return ERROR_SUCCESS;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接