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