在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);
如果重要的话,我在vwmare中运行vista和windows 7。
答案 0 :(得分:0)
在Vista或Windows 7系统中启用了 DPI虚拟化>吗?我不确定,但这可能是IsProcessDPIAware
返回TRUE
的原因
http://msdn.microsoft.com/en-us/library/dd464660.aspx#setting_dpi_by_using_control_panel
答案 1 :(得分:0)
有三种条件会强制Windows 7中的DPI感知,无论清单如何:
请注意,其他任何兼容性设置都不会更改此设置。选择“禁用桌面合成”将在初始化进程时禁用桌面合成,但是在进行了强制DPI感知检查之后,导致启动多个实例将导致第一个实例没有强制DPI感知,但随后的实例具有强制DPI感知。 / p>
DPI感知是由在TEB-> Win32ClientInfo.CI_flags中设置的标志0x20000000强制的。这是在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;
}