SetWindowLong基礎理論

SetWindowLong
SetWindowLong是一個Windows API函數。該函數用來改變指定窗口的屬性.函數也將指定的一個32位值設置在窗口的額外存儲空間的指定偏移位置。
註冊窗口類時可以指定“每窗口額外內存
這段內存可以通過Get(Set) WindowLong 來訪問
SetWindowLong 的 nIndex 參數如果不小於0。 SetWindowLong() 用於改變一個窗口的屬性。 屬性包括窗口的樣式、擴展樣式、窗口函數、窗口的ID值、窗口所在的進程的句柄、和用戶自定義的一個USER DATA(也就是WNDCLASS結構裏的cbWndExtra,通常爲0, 其實沒有多大的作用)。 至於改變的是何種屬性就由該API的第二個參數nIndex決定,譬如GWL_STYLE就代表要修改的是窗口的樣式,具體的樣式標緻由第三個參數dwNewLong指出,比如窗口過程可以指定GWLP_WNDPROC,過程函數由第三個參數指定。

原型:SetWindowLong(
HWND hWnd, // handle to window
int nlndex, // offset of value to set
LONG dwNewLong // new value
);
參數:
hWnd
窗口句柄及間接給出的窗口所屬的類。
nlndex
指定將設定的大於等於0的偏移值。有效值的範圍從0到額外類的存儲空間的字節數減4:例如若指定了12或多於12個字節的額外窗口存儲空間,則應設索引位8來訪問第三個4字節,同樣設置0訪問第一個4字節,4訪問第二個4字節。
比如可以設置爲:
SetWindowLong(m_pDlgBase->GetSafeHwnd(), GWLP_WNDPROC(指定窗口過程), (LONG)HandleWriteHwndProc(窗口函數));
GWLP_WNDPROC:值爲 - 4,爲窗口設定一個新的處理函數。 回掉函數通過第三個參數設置。

備註:
如果由hWnd參數指定的窗口與調用線程不屬於同一進程,將導致SetWindowLong函數修改窗口過程失敗,也就是說設置的是同一進程的窗口。
如果使用帶GWL_WNDPROC索引值的SetWindowLong函數替換窗口過程,則該窗口過程必須與WindowProccallback函數說明部分指定的指導行一致。

可以使用帶GWL_WNDPROC索引值的SetWindowLong函數創建一個窗口類的子類該窗口類是用於創建該窗口的類。一個應用程序可以以一個系統類爲子類,
但是不能以一個其他進程產生的窗口類爲子類,SetwindowLong函數通過改變與一個特殊的窗口類相聯繫的窗口過程來創建窗口子類,從而使系統調用新的窗口過程而不是以前定義的窗口過程。應用程序必須通過調用CallWindowProc函數向前窗口傳遞未被新窗口處理的消息,這樣作允許應用程序創建一個窗口過程鏈。

其他參考網上函數說明使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章