金山詞霸彈出窗口的簡易實現

 前幾天在做一個詞典程序,想實現類似金山詞霸的自動彈出提示窗口,有點心得,記下。
目的:在屏幕取到詞後彈出提示窗口,該窗口停留一段時間後自動消失,除非:
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章