Win32 检测窗口是否最大化/停靠到半屏(Win 键 + 左/右)

Ter*_*ity 2 c++ winapi

我有一个经典的 Win32-API (C++) 应用程序,需要检测窗口是否停靠在屏幕的左/右半部分。

问题的背景是窗口的大小仅以网格为单位,假设为 32 像素。在全屏模式下,程序会检测到该状态,允许大小与全屏匹配并填充多余的空间。对于 Windows 8 及更高版本,我想做同样的事情,而不是当前留下边框(因为大小会捕捉到 32 像素的倍数)。

Eri*_*ard 5

使用功能GetWindowPlacement(),您可以获取正常窗口矩形,使用成员rcNormalPositionWINDOWPLACEMENT。然后将普通矩形与实际窗口矩形进行比较。如果它们不匹配,则窗口很可能处于停靠状态。

例子:

bool IsDockedToMonitor(HWND hWnd)
{
    WINDOWPLACEMENT placement = {sizeof(WINDOWPLACEMENT)};
    GetWindowPlacement(hWnd, &placement);
    RECT rc;
    GetWindowRect(hWnd, &rc);

    return placement.showCmd == SW_SHOWNORMAL
        && (rc.left != placement.rcNormalPosition.left ||
            rc.top != placement.rcNormalPosition.top ||
            rc.right != placement.rcNormalPosition.right ||
            rc.bottom != placement.rcNormalPosition.bottom);
}
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案并非 100% 可靠。即使窗口停靠在显示器的一侧,正常矩形和当前窗口矩形也有可能匹配。