## 沒有躲過的坑--捕獲窗口之外的鼠標消息(鉤子還是??)
做一個發送表情的對話框,類似微信和QQ一樣的,點擊表情按鈕,彈出表情框,鼠標點擊表情框外時,這個表情框被kill。
說白了 就是在這個窗口上獲得窗口外面的鼠標消息。
Google百度了一番,很多人說道使用鉤子,才能獲得窗口外面的click事件,這也未免太小題大做了吧。
還好發現了一個簡簡單單的函數:?
**SetCapture(*this);**?
函數功能:該函數在屬于當前線程的指定窗口里設置鼠標捕獲。一旦窗口捕獲了鼠標,所有鼠標輸入都針對該窗口,無論光標是否在窗口的邊界內。同一時刻只能有一個窗口捕獲鼠標。如果鼠標光標在另一個線程創建的窗口上,只有當鼠標鍵按下時系統才將鼠標輸入指向指定的窗口。
所以在創建窗口的時候,使用這個函數,就使得這個窗口可以獲得窗口之外的鼠標click消息:
~~~
int cx = 500;
int cy = 800;
SetWindowPos(*this, NULL, x_position_, y_position_, cx, cy, SWP_FRAMECHANGED);
SetCapture(*this);
~~~
接下來的工作就簡單了,就是獲得鼠標點擊的位置,使用GetCursorPos()函數:
函數功能:該函數檢取光標的位置,以屏幕坐標表示。?
函數原型:BOOL GetCursorPos(LPPOINT lpPoint);?
參數:?
IpPoint:POINT結構指針,該結構接收光標的屏幕坐標。
這樣就可以在這個窗口的消息隊列中進行判斷了:
~~~
POINT click_point;
GetCursorPos(&click_point);
if (x_position_ + 500 > click_point.x && click_point.x > x_position_
&& y_position_ + 800 > click_point.y
&& click_point.y> y_position_)
{
MessageBox(NULL, "表情", L"沒有表情", NULL);
}
else
{
//delete 該窗口
}
~~~
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常