45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:实现金山词霸弹出窗口的方法

实现金山词霸弹出窗口的方法

2016-09-09 09:19:27 来源:www.45fan.com 【

实现金山词霸弹出窗口的方法

前几天在做一个词典程序,想实现类似金山词霸的自动弹出提示窗口,有点心得,记下。
目的:在屏幕取到词后弹出提示窗口,该窗口停留一段时间后自动消失,除非:
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;
}

 

本文地址:http://www.45fan.com/a/question/73906.html
Tags: 弹出 窗口 金山
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部