如何激活"禁用高dpi设置下的显示缩放"默认情况下

时间:2015-01-30 18:08:03

标签: mfc c++-cli windows-8.1 dpi chromium-embedded

我们的应用程序在某些具有高DPI设置(150%或更高)的Windows 8.1设备上无法正常运行。具体来说,我们使用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。但是,这似乎不起作用。

1 个答案:

答案 0 :(得分:1)

根据CEF的更新确定了潜在的问题。

然而,过渡期的解决方案(以及对这个问题的实际答案,希望对其他人有用)是在高DPI设置上打开"禁用显示缩放"我们(WiX)安装期间使用自定义操作的复选框。以下是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;
}