我可以让MoveWindow在Windows 10中使用屏幕坐标吗? C ++

时间:2017-02-08 00:44:00

标签: c++ winapi windows-10

我写了一个简单的实用程序,通过键入窗口新的所需宽度,高度和左上角,可以移动和/或调整屏幕上的任何窗口大小。它在100%缩放时效果很好,但在更改缩放时失败。

例如,在我的4k显示器上,我有150%的缩放设置。 MoveWindow将我的3840x2160显示屏视为2560x1440显示屏。当我告诉窗口移动到(1280,0)时,它会将左上角移动到屏幕的顶部中心。我希望我的程序在我输入(1920,0)时这样做。这个问题是我仍然可以将窗口物理移动到屏幕上的每个像素。 MoveWindow只是无法访问介于其间的额外像素。

我可以采取哪些措施强制MoveWindow忽略缩放值吗?

2 个答案:

答案 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();
}