将窗口锁定到特定显示(winapi)

时间:2013-11-16 07:50:17

标签: c++ windows winapi

我希望通过检查消息WM_MOVE并使用SetWindowPos函数将窗口保持在显示范围内来防止窗口在监视器之间移动。当我尝试这样做时,窗口会在鼠标所在的位置短暂闪烁,然后捕捉到屏幕底部的一个小区域。我不确定为什么会这样,因为代码就像任何其他碰撞检测一样:

case WM_MOVE:
{
    int nX = (int)(short)LOWORD(lParam);
    int nY = (int)(short)HIWORD(lParam);

    if (nX < pDisplayDevice->getLeft()) {
        nX = pDisplayDevice->getLeft();
    } else if (nX + int(uNormalWidth) > pDisplayDevice->getRight()) {
        nX = pDisplayDevice->getRight() - int(uNormalWidth);
    }

    if (nY < pDisplayDevice->getTop()) {
        nY = pDisplayDevice->getTop();
    } else if (nY + int(uNormalHeight) > pDisplayDevice->getBottom()) {
        nY = pDisplayDevice->getBottom() - int(uNormalHeight);
    }

    SetWindowPos(hWnd, 0, nX, nY, uNormalWidth, uNormalHeight, 0);
}
break;

pDisplayDevice基本上是指向包含显示坐标的Rect的指针,而uNormalWidth / uNormalHeight是窗口模式下窗口的宽度和高度。

1 个答案:

答案 0 :(得分:1)

WM_MOVE

  

lParam 客户端左上角的x和y坐标   窗户的区域。低位字包含x坐标   高阶词包含y坐标。

每次进入WM_MOUSE时,向右移动窗口+8像素,向下移动+30像素(我的代码中没有菜单)。这是左侧大小边框的宽度和顶部大小边框+标题栏的高度。

该移动会触发一个WM_MOVE处理的递归链,最终会产生一些coords。

你能做什么:

1。按照Jonathan的建议。 WM_MOVE不是您要查找的邮件,而是WM_WINDOWPOSCHANGING

2. 使用非客户端坐标:

int nX = (int)(short)LOWORD(lParam);
int nY = (int)(short)HIWORD(lParam);

RECT rect;
GetWindowRect( hWnd, &rect );
nX = rect.left;
nY = rect.top;

if (nX < pDisplayDevice->getLeft()) {

[...]