我们的应用程序在某些具有高DPI设置(150%或更高)的Windows 8.1设备上无法正常运行。具体来说,我们使用CEF托管嵌入式Web浏览器。所有这些嵌入式CEF浏览器都会使元素偏移。
当选中“在高DPI设置下禁用显示缩放”时,应用程序正常工作。但是,默认情况下不会选中此项。
如何确保我的应用程序(基于MFC)构建时默认选中此设置?
我已尝试根据以下帖子切换DPI认知:https://msdn.microsoft.com/en-us/magazine/dn574798.aspx和http://blogs.msdn.com/b/vcblog/archive/2010/03/11/mfc-applications-now-default-to-being-dpi-aware.aspx。但是,这似乎不起作用。
答案 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;
}