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