Windows 禁止悬浮窗移出屏幕外的有效实现

不对悬浮窗的移动加以处理是一件让用户很头疼的事。如果我们仅仅在按下左键时发送 WM_NCLBUTTONDOWN 消息,用户不能轻轻松松地让悬浮窗靠边,或者一不小心就把窗口移出屏幕外了。这就要求我们开发者要对其奋力优化。

假设我们移动悬浮窗的基本代码如下:

    case WM_LBUTTONDOWN:
    {
        SendMessage(hwnd, WM_NCLBUTTONDOWN, 2, 0);
        return TRUE; //DialogBox ^_^
    }

考虑到使用效果,我们不可能处理 WM_MOVE 消息(其实我没有试过),而应该处理 WM_MOVING 消息,让我们先看一下 WM_MOVING 的介绍:

wParam
This parameter is not used.

lParam
A pointer to a RECT structure with the current position of the window, in screen coordinates. To change the position of the drag rectangle, an application must change the members of this structure.

所以我们更改 lParam 指向的那个 RECT 就可以啦。

    case WM_MOVING:
    {
        RECT *rect = (RECT*)lParam;
        //改rect
        return TRUE;
    }

那怎么做才能让用户有比较好的体验呢?下面谈谈我的思路。
首先我们知道窗口大小是不会变化的,所以我们只需要保存窗口左上角的坐标就可以了。然后我们就可以使用 SystemParametersInfo(SPI_GETWORKAREA, 0, &rRet, 0); 获取窗口应当出现的位置的矩形,并根据窗口大小算出窗口左上角可能的位置的矩形。为了在移动时鼠标和窗口的相对位置尽量不变&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值