Windows核心編程(5)

來源:互聯網
上載者:User

標籤: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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.