我写了一个简单的实用程序,通过键入窗口新的所需宽度,高度和左上角,可以移动和/或调整屏幕上的任何窗口大小。它在100%缩放时效果很好,但在更改缩放时失败。
例如,在我的4k显示器上,我有150%的缩放设置。 MoveWindow
将我的3840x2160显示屏视为2560x1440显示屏。当我告诉窗口移动到(1280,0)时,它会将左上角移动到屏幕的顶部中心。我希望我的程序在我输入(1920,0)时这样做。这个问题是我仍然可以将窗口物理移动到屏幕上的每个像素。 MoveWindow
只是无法访问介于其间的额外像素。
我可以采取哪些措施强制MoveWindow
忽略缩放值吗?
答案 0 :(得分:2)
正如IInspectable早些时候所说,在我做出以下更改之前,该程序在Windows 7上确实失败了。到目前为止,这似乎在Windows 7到10上运行良好。
if (IsWindows8Point1OrGreater())
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
hinstLib = LoadLibrary(TEXT("SHCore.dll"));
if (hinstLib != NULL)
{
ProcAdd = (MYPROC)GetProcAddress(hinstLib, "SetProcessDpiAwareness");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
HRESULT ejHR = (ProcAdd)(PROCESS_PER_MONITOR_DPI_AWARE);
}
fFreeResult = FreeLibrary(hinstLib);
}
if (!fRunTimeLinkSuccess)
{
SetProcessDPIAware();
}
}
else if (IsWindowsVistaOrGreater())
{
SetProcessDPIAware();
}
答案 1 :(得分:0)
Jonathan Potter是对的。我所要做的就是设置DPI感知,然后我的所有MoveWindow调用都以真正的分辨率工作,无论我选择移动或调整大小的其他程序窗口。我刚刚将以下代码添加到WinMain:
if (IsWindowsVistaOrGreater())
{
HRESULT ejHR = SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
}
else
{
SetProcessDPIAware();
}