金山词霸弹出窗口的简易实现

 前几天在做一个词典程序,想实现类似金山词霸的自动弹出提示窗口,有点心得,记下。
目的:在屏幕取到词后弹出提示窗口,该窗口停留一段时间后自动消失,除非:
1. 鼠标不发生移动或者移动幅度很小 或
2. 鼠标移动到该弹出窗口上,并在该窗口内操作 或
3. 鼠标拖动该弹出窗口

如果鼠标从该弹出窗口移动出来,该弹出窗口就消失。

一开始,问题想得很复杂,因为要想知道鼠标从该弹出窗口中移动到窗口外面,单单在该弹出窗口中是无法得到这样的消息通知的,因此考虑使用mouse hook来截获该消息,试过以后发现虽然能工作,但解决方案太复杂,因此开始考虑有没有更简单的方法。最后想到一个非常简单的实现,可以实现很好的效果,希望对有些人有用(看似简单,不过如果想不到还是蛮郁闷的)。

解决方法:给该窗口设置一个定时器,每次定时器到点时检查鼠标位置,检查:
1. 如果鼠标位置在该弹出窗口附近,表示鼠标没有发生大的移动,则窗口不消失
2. 如果GetCapture存在,表示正在capture mouse(用鼠标移动窗口),则窗口不消失
3. 否则窗口消失

...
SetTimer(hWnd, IDT_TIMER, 400, (TIMEPROC)MyTimeProc);
...

void MyTimeProc(HWND hWnd, UINT uMsg, UINT PTR idEvent, DWORD dwTime)
{
    if (GetCapture() != 0)
        return;

    POINT pt;
    GetCursorPos(&pt);
    RECT rect;
    GetWindowRect(hWnd, &rect);
    rect.left -= 5;
    rect.top -= 5;
    if (PtInRect(&rect, pt))
        return;

    ShowWindow(hWnd, SW_HIDE);
    KillTimer(hWnd, IDT_TIMER);
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值