複製鏈接
請複製以下鏈接發送給好友

SetWindowLong

鎖定
SetWindowLong是一個Windows API函數。該函數用來改變指定窗口的屬性.函數也將指定的一個32位值設置在窗口的額外存儲空間的指定偏移位置
中文名
設置窗口長型
外文名
SetWindowLong
作    用
改變指定窗口的屬性
類    型
Windows API函數
函數原型
BOOL UnregisterClass
相關函數
GetWindowLong

SetWindowLong函數原型

LONG SetWindowLong(
    HWND hWnd,               // handle to window
    int nIndex,              // offset of value to set
    LONG dwNewLong           // new value
);

SetWindowLong參數

hWnd
窗口句柄及間接給出的窗口所屬的類。
nlndex
指定將設定的大於等於0的偏移值。有效值的範圍從0到額外類的存儲空間的字節數減4:例如若指定了12或多於12個字節的額外窗口存儲空間,則應設索引位8來訪問第三個4字節,同樣設置0訪問第一個4字節,4訪問第二個4字節。要設置其他任何值,可以指定下面值之一:
常量
常量值
意義
GWL_EXSTYLE
-20
設定一個新的擴展風格。
GWL_HINSTANCE
-6
設置一個新的應用程序實例句柄。
GWL_ID
-12
設置一個新的窗口標識符
GWL_STYLE
-16
設定一個新的窗口風格。
GWL_USERDATA
-21
設置與窗口有關的32位值。每個窗口均有一個由創建該窗口的應用程序使用的32位值。
GWL_WNDPROC
-4
為窗口設定一個新的處理函數。
GWL_HWNDPARENT
-8
改變子窗口的父窗口,應使用SetParent函數。
當hWnd參數標識了一個對話框時,也可使用下列值:
常量
常量值
意義
DWL_DLGPROC
DWLP_MSGRESULT + sizeof(LRESULT) (值:4)
設置對話框過程的新地址。
DWL_MSGRESULT
0
設置在對話框過程中處理的消息的返回值
DWL_USER
DWLP_DLGPROC + sizeof(DLGPROC) (值:8)
設置的應用程序私有的新的額外信息,例如一個句柄或指針
dwNewLong
指定的替換值。
dwNewLong中可以使用以下一些列表控件的專用風格:
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT
這四種風格決定控件的外觀,同時只可以選擇其中一種,分別對應:
大圖標顯示,小圖標顯示,列表顯示,詳細報表顯示
LVS_EDITLABELS 結點的顯示字符可以被編輯,對於報表風格來講可編輯的只為第一列。
LVS_SHOWSELALWAYS 在失去焦點時也顯示當前選中的結點
LVS_SINGLESEL 同時只能選中列表中一項 [1] 

SetWindowLong返回值

如果函數成功,返回值是指定的32位整數的原來的值。如果函數失敗,返回值為0。若想獲得更多錯誤信息,請調用GetLastError函數
如果指定32位整數的原來的值為0,並且函數成功,則返回值為0,但是函數並不清除最後的錯誤信息,這就很難判斷函數是否成功。這時,就應在調用SetWindowLong之前調用SetLastError(0)函數來清除最後的錯誤信息。這樣,如果函數失敗就會返回0,並且GetLastError。也返回一個非零值

SetWindowLong其他信息

如果由hWnd參數指定的窗口與調用線程不屬於同一進程,將導致SetWindowLong函數修改窗口過程失敗。
指定的窗口數據是在緩存中保存的,因此在調用SetWindowLong之後再調用SetWindowPos函數才能使SetWindowLong函數所作的改變生效。
如果使用帶GWL_WNDPROC索引值的SetWindowLong函數替換窗口過程,則該窗口過程必須與WindowProccallback函數説明部分指定的指導行一致。
如果使用帶DWL_MSGRESULT索引值的SetWindowLong函數來設置由一個對話框過程處理的消息的返回值,應在此後立即返回TRUE。否則,如果又調用了其他函數而使對話框過程接收到一個窗口消息,則嵌套的窗口消息可能改寫使用DWL_MSGRESULT設定的返回值。
可以使用帶GWL_WNDPROC索引值的SetWindowLong函數創建一個窗口類子類,該窗口類是用於創建該窗口的類。一個應用程序可以以一個系統類為子類,但是不能以一個其他進程產生的窗口類為子類,SetwindowLong函數通過改變與一個特殊的窗口類相聯繫的窗口過程來創建窗口子類,從而使系統調用新的窗口過程而不是以前定義的窗口過程。應用程序必須通過調用CallWindowProc函數向前窗口傳遞未被新窗口處理的消息,這樣作允許應用程序創建一個窗口過程鏈。
通過使用函數RegisterClassEx將結構WNDCLASSEX中的cbWndExtra單元指定為一個非0值來保留新外窗口內存。
不能通過調用帶GWL_HWNDPARENT索引值的SetWindowLong的函數來改變子窗口的父窗口,應使用SetParent函數。
Windows CE:nlndex參數必須是4個字節的倍數不支持unaligned access
不支持下列nlndex參數值
GWL_HINSTANCE;GWL_HWNDPARENTGWL;GWL_USERDATA
Windows CE 2.0版支持在nlndex參數中的DWL_DLGPROC值,但是WindowsCE1.0不支持。

SetWindowLong需求

DLL最低版本
user32.dll
頭文件
在Winuser.h中聲明,包含於Windows.h
庫文件
User32.lib
操作系統最低版本
Windows 95, Windows NT 3.1
ANSI和Unicode的API名
SetWindowLongA (ANSI)和SetWindowLongW (Unicode)
速查:Windows NT 3.1以上版本;Windows 95以上版本;Windows CE 1.0以上版本;
頭文件:winuser.h;庫文件:user32.lib;Unicode:在Windows NT上實現為ANSI和Unicode兩種版本。

SetWindowLong其它函數

函數功能:該函數刪除一個窗口類,清空該類所需的內存。
函數原型:BOOL UnregisterClass(LPCTSTR IpClassNameHINSTANCE hlnstance);
參數:
IpClassName:指向一個空結束字符串的指針,或是一個整型原子。如果IpClassName是一個字符串,則它指定了窗口類的類名。這個類名必須由此前調用RegisterClassEx函數來註冊。系統類,如對話框控制,必須被註冊。
如果這個參數是一個整型原子,它必須是由此前調用GlobalAdd原子函數創建的全局原子。這個16位整型數小於OxCOOO,必須是lpszClass的低16位,其高位宇必須為0。
hlnstance:創建類的模塊的實例句柄。
返回值:如果函數成功,返回值為非零;如果未發現類或由此類創建的窗口仍然存在,則返回值為0。
若想獲得更多錯誤信息,請調用GetLastError函數。
備註:在調用這個函數之前,應用程序必須銷燬由指定類創建的所有窗口。
應用程序註冊的所有窗口類在應用程序中止後都為未註冊的類。
Windows 95:所有由OLL註冊的窗口類在DLL卸載後均未註冊的類。
windows NT:所有由DLL註冊的類在DLL卸載後仍為已註冊的類。
速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭文件:winuser.h;庫文件:user32.lib;Unicode:在Windows NT上實現為Uhicode和ANSI兩種版本。
本API在VB中的使用方法:
Private Declare Function SetClassLong Lib "user32.dll" Alias "SetClassLongA" ( _
                          ByVal hwnd As Long, _
                          ByVal nIndex As Long, _
                          ByVal dwNewLong As Long _
                          ) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
                          ByVal hwnd As Long, _
                          ByVal nIndex As Long, _
                          ByVal dwNewLong As Long _
                          ) As Long
Private Const GCL_STYLE As Long = -26&
Private Const GWL_STYLE As Long = -16&
Private Const GWL_EXSTYLE As Long = -20&

Private Sub Form_Load()
    SetClassLong hwnd, GCL_STYLE, 0&
    SetWindowLong hwnd, GWL_STYLE, 0&
    SetWindowLong hwnd, GWL_EXSTYLE, 0&
    Hide
    Show
    DoEvents
    End
End Sub


參考資料