我有一个经典的 Win32-API (C++) 应用程序,需要检测窗口是否停靠在屏幕的左/右半部分。
问题的背景是窗口的大小仅以网格为单位,假设为 32 像素。在全屏模式下,程序会检测到该状态,允许大小与全屏匹配并填充多余的空间。对于 Windows 8 及更高版本,我想做同样的事情,而不是当前留下边框(因为大小会捕捉到 32 像素的倍数)。
使用功能GetWindowPlacement(),您可以获取正常窗口矩形,使用成员rcNormalPosition的WINDOWPLACEMENT。然后将普通矩形与实际窗口矩形进行比较。如果它们不匹配,则窗口很可能处于停靠状态。
例子:
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% 可靠。即使窗口停靠在显示器的一侧,正常矩形和当前窗口矩形也有可能匹配。