我有一个经典的Win32-API(C++)应用程序,需要检测窗口是否停靠在屏幕的左/右一半。
问题的背景是,窗口仅以网格步长大小,例如32像素。在全屏模式下,程序会检测到该状态,允许大小与全屏匹配,并填充多余的空间。在Windows 8和更高版本中,我想做同样的事情,而不是当前保留边框(因为大小会捕捉到32像素的倍数)。
最佳答案
除了IInspectable已经提到的内容外,还有另一种方法可以确定此信息并采取相应的措施。
WM_WINDOWPOSCHANGED
消息,并从x
中存储的 y
指针中读取其cx
,cy
,WINDOWPOS
和lParam
值。 MonitorFromWindow
来获取放置窗口的当前监视器的句柄。 MONITORINFO
变量,并将其cbSize
字段设置为sizeof(MONITORINFO)
。 MONITORINFO
变量的地址来调用 GetMonitorInfo
。 rcWork
变量中读取MONITORINFO
值。rcWork.top == WINDOWPOS.y && rcWork.bottom == (WINDOWPOS.y + WINDOWPOS.cx) && rcWork.left == WINDOWPOS.x
-窗口“停靠”在左侧rcWork.top == WINDOWPOS.y && rcWork.bottom == (WINDOWPOS.y + WINDOWPOS.cx) && rcwork.right == (WINDOWPOS.x + WINDOWPOS.cx)
-窗口“停靠”在右侧rcWork.top == WINDOWPOS.y && rcWork.left == WINDOWPOS.x && rcWork.right == (WINDOWPOS.x + WINDOWPOS.cx)
-窗口“停靠”到顶部rcWork.top == (WINDOWPOS.y + WINDOWPOS.cy) && rcWork.left == WINDOWPOS.x && rcWork.right == (WINDOWPOS.x + WINDOWPOS.cx)
-窗口“停靠”到底部您说您已经具有确定窗口是全屏的逻辑(您是指全屏还是最大化?),但是如果使用
left == x && top == y && right == x + cx && bottom == y + cy
,则可以确定有效的最大化。Here is an MSDN example of something similar.
请注意,可能更需要缓存
MONITORINFO
值,这样就不必在每次重新定位窗口时都调用它。如果只希望在用户不手动调整窗口大小时应用此方法,则以下是一个可能的方法示例:
LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
static bool userSizing = false;
switch (msg)
{
// could also catch WM_ENTERSIZEMOVE here, but this will trigger on
// moves as well as sizes
case WM_SIZING:
userSizing = true;
break;
case WM_EXITSIZEMOVE:
userSizing = false;
break;
case WM_WINDOWPOSCHANGED:
if (userSizing)
{
break;
}
// do logic to check to see if the window is sized in a "docked"
// manner here
break;
// handle other window messages ...
}
}
关于c++ - Win32检测窗口是否最大化/停靠到半屏(Win键+左/右),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47888651/