1. 程式人生 > >Windows核心編程(5)

Windows核心編程(5)

c++ mfc

一、工具提示窗口

1.有時候把鼠標移動到一個窗口控件的時候

會有一個提示彈出來,這個的原理就是給工具提示窗口

發送一個消息,TM_ADDTOOL


2其中參數LPARAM是TOOLINFO結構體指針

typedef struct tagTOOLINFO{
UINT cbSize 結構體大小

UINT uFlag 焦點域的屬性

HWND hWnd 包含工具的窗口標題,如果指定TTF_IDISHWND標準

則忽略值,而是用uid成員的值作為窗口句柄

UINT_PTR uId 吐過uFlag包含TTF_IDISHWND

此值為"工具"窗口句柄, 如果內有包含 此值為工具ID,

RECT rect 如果包含TTF_IDISHWNDj就忽略此值,否則指定工具大小的RECT結構

HINSTANCE hinst 應用程序實例句柄

LPTSTR lpszText 這個域可以有如下幾個值: 如果為LPSTR_TEXTCALBACK

工具就向它的窗口發送TTN_NEEDTEXT消息獲得要點是的字符串

如果為資源標識 則顯示資源標識所對應的字符串

如果為字符串指針,則顯示字符指針指向的字符串

LPARAM lParam void* lpReserved

)TOOLINFO;

}




二、窗口半透明

1.創建帶有擴展屬性的窗口,CreateWindow函數參數沒有擴展屬性信息

要帶有擴展信息使用CreateWindowEx

參數1 窗口窗口的擴展樣式

參數2 窗口類名

參數3 窗口標題

參數4 窗口樣式

參數5 6 坐標

參數7 8 大小

參數9 父窗口

參數10 窗口菜單句柄

參數11 程序實例句柄

參數12 創建窗口附加數據指針

通過CREATESTRUCT結構體傳遞到WM_CREATE消息的LPARAM參數中




2改變窗口各種屬性: 風格,擴展風格,ID,窗口消息過程,用戶數據等

LONG SetWindowLong(

參數1 改變屬性的窗口

參數2 nIndex 改變的類型

改變樣式或擴展樣式 GWL_STYLE GWL_EXSTYLE

ID類型 GWL_ID

應用程序句柄類型 GWL_HINSTANCE

用戶數據類型 GWL_USERDATA

窗口消息處理類型 GWL)WNDPROC


LONG dwNewLong 窗口的新屬性值,具體的屬性類型依賴於nIndex參數

)

返回創建舊屬性,具體返回什麽依賴nIndex參數




3獲取窗口的屬性

GetWindowLong

參數1 要獲取的窗口句柄

參數2 含義和上面的nIndex意義

返回nIndex參數類型獲得相應返回值


4.要修改擴展樣式,就要先獲得原來的擴展樣式

然後再修改,比如將普通窗口改成層窗口

//獲得樣式

LONG lExStyle = GetWindowLong(hWnd,GWL_EXSTYLE);

//修改樣式

lExStyle |= WS_EX_LAYERED

//設置樣式

SetWindowLong(hWnd,GWL_EXSTYLE,lExStyle );




5.普通窗口變成層窗口 就可以具有半透明效果了

SetLayeredWindowAttributes

設置層窗口屬性

參數1 設置屬性窗口

參數2 掩碼顏色 可以用RGB指定

參數3 透明度取值範圍(0-255)0完全透明 255不透明

參數4 透明方式

LWA_ALPHA 參數2無效 參數3有效

LWA_COLORKEY 窗口中顏色為參數2的地方變透明

參數3失效


執行成功返回TRUE





三、不規則窗口

1.大部分窗口都是長方形這樣的,當要做成一個

不規則的窗口應該這樣做

2.SetWindowRgn函數

在窗口區域之外的部分不顯示,相當於透明消息

窗口區域內的正常顯示,窗口區域的編輯相當於窗口形狀

參數1 HWND 要改變窗口區域的句柄

參數2 HRGN 新的窗口區域句柄

參數3 BOOL 設置窗口區域後 窗口界面是否重畫

成功返回非零值


3.窗口RGN

CreateRectRgn 創建普通矩形區域

CreateRoundRectRgn 創建圓角矩形

CreateEllipticRgn 創建園型區域

ExtCreateRegion 創建自定義區域


4 CreateRoundRectRgn

參數1 左上角x坐標

參數2 左上角y坐標

參數3 右下降x坐標

參數4 右下角y坐標

int w圓角園寬度

int h園高度


5.CreateEllipticRgn

參數1 園的外切矩形左上角x坐標

參數2 園的外切矩形左上角y坐標

參數3 園的外切矩形右下降x坐標

參數4 園的外切矩形右下角y坐標


6.ExtCreateRegion

參數1 lpx為執行XFORM結構體指針,用對創建後的區域做變化

如果指針為空 代表創創建後區域不變換

DWORD nCount lpData所指向控件大小

CONST RGNDATA* lpData 指向RGNDATA結構體指針,包含區域數據信息


7.RGNDATA結構體

RGNDATAHEADER rdg 指向RGNDATAHEADER 結構體變量為區域數據頭信息

char Buffer[1]執行一個任意大小緩沖區.存放區域信息的RECT結構體


8.RGNDATAHEADER 結構體

DWIRD dwSize 結構體大小

DWORD iType 區域類型 必須為RDH_RECTANGLES

DWORD nCount 組成區域的所有矩形個數

DWORD nRgnSize 組成區域的所有矩形的緩沖區大小

RECT rcBound 區域的矩形邊界




四、截獲窗口消息或事件

1.有時候要改變Windows的MessageBox 改成自己的,

但是他是Windows裏的, 我們沒有源碼, 所以我們需要用到

攔截他的PAINT消息,改變他的繪制效果.

2.可以通過子類化的方法 SetWindowLong 把他的消息過程改了

但是呢 他這個你要在哪裏改呢, 如果是在他彈出來後在更改

這樣就給人效果不好了, 所以你要知道窗口是再哪初始化最好的

然後來修改, 對話框一般在WM_INITDIALOG消息進行初始化

所以在這裏修改最好.把他子類化,

3.那我怎麽知道WM_INITDIALOG這個消息呢

通過Windows裏的鉤子



五、鉤子

在目標消息函數處理之前,處理該消息

1.安裝鉤子函數SetWindowsHookEx

HHOOK SetWindowsHookEx(

int idHook, //鉤子類型


HOOKPROC lpfn, //鉤子程序函數指針

(

如果dwThreadId參數為0或者是由別的進程創建的線程表示,

那麽ipfn必須指向DLL中的鉤子程序,,

如果dwThreadId為當前進程所創建的線程標識,那麽ipfn可以

指向當前進程的鉤子程序,lpfn為HOOKPROC

typedef LRESULT(CALLBACK* HOOKPROC)(int code,WPARAM,LPARAM)

code 提示了是否處理該消息,如果參數值為HC_ACTION,則可以處理

該消息,如果code值小於0,則不需要處理消息,這是要調用CallNext

HookEx函數並返回這個函數的值,CallNextHookEx為調用鉤子列表

中下一個鉤子的鉤子程序.

)


HINSTANCE hmod,//lpfn所在程序模塊的實例句柄,如果dwThreadId

為當前進程所創建的線程表示並且鉤子程序代碼也也位於當前進程,

則hmode必須為NULL


DWORD dwThreadId, //鉤子程序相關聯的線程的標識符,如果為0,

鉤子程序就與所有程序關聯,這時的鉤子就是全局鉤子.

)




2.鉤子類型

每一類型的鉤子可以使應用程序能夠監視不同類型的消息處理機制

具體有:WH_CALLWNDPROC和WH_CALLWNDPROCRET:這兩種類型使你

監視發送到窗口過程的消息,系統再消息發送到接收窗口過程之前調用

WH_CALLWNDPROC類型的鉤子,在窗口過程處理完消息之後調用

WH_CALLWNDPROCRET類型的鉤子

WH_CBT:以下事件之前,系統都調用WH_CBT類型鉤子

1) 激活,建立,最小化,最大化,移動,改變窗口大小,等窗口事件

2) 完成系統指令

3) 來自系統消息隊列中的移動鼠標,鍵盤事件

4) 設置輸入焦點事件

5) 同步系統消息隊列事件

WH_GETMESSAGE: 監視從消息隊列返回的消息,可使用

該鉤子類型去監視鼠標和鍵盤輸入,已經發送到消息隊列中的其他消息

WH_KEYBOARD:應用程序可以使用WH_KEYBODY類型的鉤子監視消息隊列中的

鍵盤消息,

WH_MOUSE 應用程序可以使用WH_MOUSE類型的鉤子來監視消息隊列中鼠標消息



3.將鉤子信息床底到當前鉤子鏈中的下一個子程,一個鉤子程序可以調用這個

函數之前或之後處理鉤子的信息

CallNextHookEx(

HHOOK hhk,當前鉤子句柄

int nCode, 等同於HOOKPROC的nCode

WPARAM wParam, 等同於HOOKPROC的wParam

LPARAM lParam, 等同於HOOKPROC的lParam

)




4.HOOKPROC回調函數

LRESULT CAKKBACK HookProc(
int iCode HC_ACTION HC_GETNEXT HC_SKIP HC_NOREMOVE.....

WPARAM 取決於鉤子類型

LPARAM 取決於鉤子類型

比如鉤子類型是WH_KEYBOARD那麽lParam和wParam等同於WM_KEYDOWN的

lParam和wParam,如果鉤子類型為WH_CALLWNDPROC,wParam表示消息

是否來源於當前線程(非零,則表示當前線程,否則來源於其他線程)

LPARAM就為指向CWPSTRUCT結構體指針.


5.卸載鉤子

UnhookWindowsHookEx

卸載之前安裝成功的鉤子

BOOL UnhookWindowsHookEx(

HHOOK hhk //之前安裝鉤子返回的鉤子句柄

)成功返回TRUE




Windows核心編程(5)