相關(guān)結(jié)構(gòu)體
PROCESSENTRY32
PROCESSENTRY32 用來存放快照進(jìn)程信息的一個(gè)結(jié)構(gòu)體。(存放進(jìn)程信息和調(diào)用成員輸出進(jìn)程信息)
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; 結(jié)構(gòu)大??;
DWORD cntUsage; 此進(jìn)程的引用計(jì)數(shù);
DWORD th32ProcessID; 進(jìn)程ID;
DWORD th32DefaultHeapID; 進(jìn)程默認(rèn)堆ID;
DWORD th32ModuleID; 進(jìn)程模塊ID;
DWORD cntThreads; 此進(jìn)程開啟的線程計(jì)數(shù);
DWORD th32ParentProcessID; 父進(jìn)程ID;
LONG pcPriClassBase; 線程優(yōu)先權(quán);
DWORD dwFlags; 保留;
char szExeFile[MAX_PATH]; 進(jìn)程全名;
} PROCESSENTRY32;
TOKEN_PRIVILEGES
typedef struct _TOKEN_PRIVILEGES{
DWORD PrivilegeCount; 要修改的特權(quán)數(shù)目
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 特權(quán)數(shù)組
}TOKEN_PRIVILEGES;
LUID_AND_ATTRIBUTES
typedef struct _LUID_AND_ATTRIBUTES
{
LUID Luid; 是Luid是一個(gè)標(biāo)志,不同的Luid代表著各種不同的特權(quán)類型。這里的Luid的值需要用LookupPrivilegeValue來獲取。
DWORD Attributes; 是要這個(gè)特權(quán)干嘛,如啟用這個(gè)特權(quán)(SE_PRIVILEGE_ENABLED)
} LUID_AND_ATTRIBUTES;
WNDCLASSEX
typedef struct WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
1.cbSize:
WNDCLASSEX 的大小。我們可以用sizeof(WNDCLASSEX)來獲得準(zhǔn)確的值。
2.style:
從這個(gè)窗口類派生的窗口具有的風(fēng)格。您可以用“or”操作符來把幾個(gè)風(fēng)格或到一起。
3.lpfnWndProc:
窗口處理函數(shù)的指針。
4.cbClsExtra:
指定緊跟在窗口類結(jié)構(gòu)后的附加字節(jié)數(shù)。
5.cbWndExtra:
指定緊跟在窗口實(shí)例的附加字節(jié)數(shù)。如果一個(gè)應(yīng)用程序在資源中用CLASS偽指令注冊(cè)一個(gè)對(duì)話框類時(shí),則必須把這個(gè)成員設(shè)成DLGWINDOWEXTRA。
6.hInstance:
本模塊的實(shí)例句柄。
7.hIcon:
圖標(biāo)的句柄。
8.hCursor:
光標(biāo)的句柄。
9.hbrBackground:
背景畫刷的句柄。
10.lpszMenuName:
指向菜單的指針。
11.lpszClassName:
指向類名稱的指針。
12.hIconSm:
和窗口類關(guān)聯(lián)的小圖標(biāo)。如果該值為NULL。則把hIcon中的圖標(biāo)轉(zhuǎn)換成大小合適的小圖標(biāo)。
補(bǔ)充:窗口類不是標(biāo)準(zhǔn)c++類
api
VirtualProtect
函數(shù)原型
BOOL VirtualProtect(
LPVOID lpAddress, // 目標(biāo)地址起始位置
DWORD dwSize, // 大小
DWORD flNewProtect, // 請(qǐng)求的保護(hù)方式
PDWORD lpflOldProtect // 保存老的保護(hù)方式
);
參數(shù)
lpAddress
[in] 指針,指向要變更保護(hù)屬性的內(nèi)存基址。
dwSize
[in] 要變更的記憶體分頁(yè)區(qū)域的大小 (單位是字節(jié))。但是需要注意,頁(yè)面邊界2字節(jié)的內(nèi)存屬性更改,有可能導(dǎo)致改變2個(gè)頁(yè)的屬性同時(shí)被改變
flNewProtect
[in] 要套用的記憶體保護(hù)類型。
lpflOldProtect
[out] 上一個(gè)記憶體保護(hù)值的指針。
WriteProcessMemory
函數(shù)原型
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesWritten
);
參數(shù)
hProcess
由OpenProcess返回的進(jìn)程句柄。
如參數(shù)傳數(shù)據(jù)為 INVALID_HANDLE_VALUE 【即-1】目標(biāo)進(jìn)程為自身進(jìn)程
lpBaseAddress
要寫的內(nèi)存首地址
在寫入之前,此函數(shù)將先檢查目標(biāo)地址是否可用,并能容納待寫入的數(shù)據(jù)。
lpBuffer
指向要寫的數(shù)據(jù)的指針。
nSize
要寫入的字節(jié)數(shù)。
注:最后一個(gè)參數(shù)已經(jīng)取消。
返回值
非零值代表成功。
可用GetLastError獲取更多的錯(cuò)誤詳細(xì)信息。
VirtualAllocEx
函數(shù)原型
LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);
參數(shù)
hProcess:
申請(qǐng)內(nèi)存所在的進(jìn)程句柄。
lpAddress:
保留頁(yè)面的內(nèi)存地址;一般用NULL自動(dòng)分配 。
dwSize:
欲分配的內(nèi)存大小,字節(jié)單位;注意實(shí)際分 配的內(nèi)存大小是頁(yè)內(nèi)存大小的整數(shù)倍
flAllocationType 可取下列值:
MEM_COMMIT:為特定的頁(yè)面區(qū)域分配內(nèi)存中或磁盤的頁(yè)面文件中的物理存儲(chǔ)
MEM_PHYSICAL :分配物理內(nèi)存(僅用于地址窗口擴(kuò)展內(nèi)存)
MEM_RESERVE:保留進(jìn)程的虛擬地址空間,而不分配任何物理存儲(chǔ)。保留頁(yè)面可通過繼續(xù)調(diào)用VirtualAlloc()而被占用
MEM_RESET :指明在內(nèi)存中由參數(shù)lpAddress和dwSize指定的數(shù)據(jù)無效
MEM_TOP_DOWN:在盡可能高的地址上分配內(nèi)存(Windows 98忽略此標(biāo)志)
MEM_WRITE_WATCH:必須與MEM_RESERVE一起指定,使系統(tǒng)跟蹤那些被寫入分配區(qū)域的頁(yè)面(僅針對(duì)Windows 98)
flProtect可取下列值:
PAGE_READONLY: 該區(qū)域?yàn)橹蛔x。如果應(yīng)用程序試圖訪問區(qū)域中的頁(yè)的時(shí)候,將會(huì)被拒絕訪
PAGE_READWRITE 區(qū)域可被應(yīng)用程序讀寫
PAGE_EXECUTE: 區(qū)域包含可被系統(tǒng)執(zhí)行的代碼。試圖讀寫該區(qū)域的操作將被拒絕。
PAGE_EXECUTE_READ :區(qū)域包含可執(zhí)行代碼,應(yīng)用程序可以讀該區(qū)域。
PAGE_EXECUTE_READWRITE: 區(qū)域包含可執(zhí)行代碼,應(yīng)用程序可以讀寫該區(qū)域。
PAGE_GUARD: 區(qū)域第一次被訪問時(shí)進(jìn)入一個(gè)STATUS_GUARD_PAGE異常,這個(gè)標(biāo)志要和其他保護(hù)標(biāo)志合并使用,表明區(qū)域被第一次訪問的權(quán)限
PAGE_NOACCESS: 任何訪問該區(qū)域的操作將被拒絕
PAGE_NOCACHE: RAM中的頁(yè)映射到該區(qū)域時(shí)將不會(huì)被微處理器緩存(cached)
注:PAGE_GUARD和PAGE_NOCHACHE標(biāo)志可以和其他標(biāo)志合并使用以進(jìn)一步指定頁(yè)的特征。PAGE_GUARD標(biāo)志指定了一個(gè)防護(hù)頁(yè)(guard page),即當(dāng)一個(gè)頁(yè)被提交時(shí)會(huì)因第一次被訪問而產(chǎn)生一個(gè)one-shot異常,接著取得指定的訪問權(quán)限。PAGE_NOCACHE防止當(dāng)它映射到虛擬頁(yè)的時(shí)候被微處理器緩存。這個(gè)標(biāo)志方便設(shè)備驅(qū)動(dòng)使用直接內(nèi)存訪問方式(DMA)來共享內(nèi)存塊。
CreateToolhelp32Snapshot
函數(shù)原型
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, 用來指定“快照”中需要返回的對(duì)象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID 一個(gè)進(jìn)程ID號(hào),用來指定要獲取哪一個(gè)進(jìn)程的快照,當(dāng)獲取系統(tǒng)進(jìn)程列表或獲取 當(dāng)
前進(jìn)程快照時(shí)可以設(shè)為0
);
參數(shù)
dwFlags
指定快照中包含的系統(tǒng)內(nèi)容,這個(gè)參數(shù)能夠使用下列數(shù)值中的一個(gè)或多個(gè)。
TH32CS_INHERIT - 聲明快照句柄是可繼承的。
TH32CS_SNAPALL - 在快照中包含系統(tǒng)中所有的進(jìn)程和線程
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的模塊。
TH32CS_SNAPPROCESS - 在快照中包含系統(tǒng)中所有的進(jìn)程。
TH32CS_SNAPTHREAD - 在快照中包含系統(tǒng)中所有的線程
th32ProcessID
指定將要快照的進(jìn)程ID。如果該參數(shù)為0表示快照當(dāng)前進(jìn)程。該參數(shù)只有在設(shè)置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情況下該參數(shù)被忽略,所有的進(jìn)程都會(huì)被快照。
返回值
解釋
調(diào)用成功,返回快照的句柄,調(diào)用失敗,返回INVALID_HANDLE_VALUE 。
備注:
使用GetLastError函數(shù)查找該函數(shù)產(chǎn)生的錯(cuò)誤狀態(tài)碼。
注意,在Win NT中,要?jiǎng)h除快照,使用CloseHandle函數(shù);在Win CE中,要?jiǎng)h除快照,使用CloseToolhelp32Snapshot函數(shù)。
LookupPrivilegeValue
BOOL WINAPI LookupPrivilegeValue(
__in_opt LPCTSTR *lpSystemName*,
__in LPCTSTR *lpName*,
__out PLUID *lpLuid*
);
參數(shù)
第一個(gè)參數(shù)是系統(tǒng)的名字,如果為NULL,就是本地名字(這里就填NULL)。
第二個(gè)參數(shù)是特權(quán)的名字。
第三個(gè)參數(shù)就可以通過指針返回一個(gè)LUID類型的Luid的標(biāo)識(shí)了。 通過這個(gè)值就可以填入LUID_AND_ATTRIBUTES結(jié)構(gòu)體里了。
OpenProcessToken
函數(shù)原型
BOOL WINAPI OpenProcessToken(
__in HANDLE *ProcessHandle*,
__in DWORD *DesiredAccess*,
__out PHANDLE *TokenHandle*
);
參數(shù)
第一個(gè)參數(shù) 進(jìn)程句柄(當(dāng)前進(jìn)程為GetCurrentProcess()為參數(shù))
第二個(gè)參數(shù) 訪問令牌特權(quán)
第三個(gè)參數(shù) 返回的參數(shù) 就是AdjustTokenPrivileges的第一個(gè)參數(shù)
注:第二個(gè)參數(shù) 是令牌的權(quán)限,這個(gè)權(quán)限是要有修改權(quán)限的特權(quán),意思就是要把你程序的權(quán)限修改得更高。
關(guān)于其他權(quán)限可以查MSDN.. 所有權(quán)限可以寫TOKEN_ALL_ACCESS ,去查看一個(gè)令牌特權(quán)可以用TOKEN_QUERY
AdjustTokenPrivileges
函數(shù)原型
BOOL WINAPI AdjustTokenPrivileges(
__in HANDLE TokenHandle,
__in BOOL DisableAllPrivileges,
__in_opt PTOKEN_PRIVILEGES NewState,
__in DWORD BufferLength,
__out_opt PTOKEN_PRIVILEGES PreviousState,
__out_opt PDWORD ReturnLength
);
參數(shù)
第一個(gè)參數(shù)為OpenProcessToken第三個(gè)指針參數(shù)傳出的句柄值
第二個(gè)參數(shù)為是否禁用所有所有的特權(quán)
第三個(gè)參數(shù)為新的TOKEN_PRIVILEGES的特權(quán)結(jié)構(gòu)體指針
第四個(gè)參數(shù)是上面結(jié)構(gòu)體的字節(jié)長(zhǎng)度(sizeof)
第五個(gè)參數(shù)是 接受原先的特權(quán)的結(jié)構(gòu)體(用途暫不清楚)
第六個(gè)參數(shù)也是這個(gè)結(jié)構(gòu)體的字節(jié)長(zhǎng)度的指針(同上)
如果第五個(gè)參數(shù)不是NULL,在OpenProcessToken加特權(quán)時(shí)除了需要指定TOKEN_ADJUST_PRIVILEGES還必須指定TOKEN_QUERY
如果第五個(gè)參數(shù)是NULL,你不接受原先的結(jié)構(gòu)體(第六個(gè)當(dāng)然也是NULL), 就不用再指定附加的TOKEN_QUERY的特權(quán)了。
返回值
失敗返回零
就算這個(gè)函數(shù)返回為非零,還要調(diào)用GetLastError()來檢驗(yàn)是否完全成功。
如果返回ERROR_SUCCESS就代表修改非常成功
Window7 和win10 需要管理員模式 才能獲取成功
CreateWindow
函數(shù)原型
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hlnstance,
LPVOID lpParam);
主要參數(shù)
lpClassName
指向一個(gè)空結(jié)束的字符串或整型數(shù)atom。如果該參數(shù)是一個(gè)整型量,它是由此前調(diào)用theGlobalAddAtom函數(shù)產(chǎn)生的全局量。這個(gè)小于0xC000的16位數(shù)必須是lpClassName參數(shù)字的低16位,該參數(shù)的高位必須是0。
如果lpClassName是一[字符串,它指定了窗口的類名。這個(gè)類名可以是任何用函數(shù)RegisterClass注冊(cè)的類名,或是任何預(yù)定義的控制類名。請(qǐng)看說明部分的列表。
LPWindowName
指向一個(gè)指定窗口名的以NULL結(jié)束的字符串指針。
如果窗口風(fēng)格指定了標(biāo)題條,由lpWindowName指向的窗口標(biāo)題將顯示在標(biāo)題條上。當(dāng)使用Createwindow函數(shù)來創(chuàng)建控制例如按鈕,選擇框和靜態(tài)控制時(shí),可使用lpWindowName來指定控制文本。
dwStyle
指定創(chuàng)建窗口的風(fēng)格。該參數(shù)可以是下列窗口風(fēng)格的組合再加上說明部分的控制風(fēng)格。風(fēng)格意義:
WS_BORDER:創(chuàng)建一個(gè)帶邊框的窗口。
WS_CAPTION:創(chuàng)建一個(gè)有標(biāo)題框的窗口(包括WS_BORDER風(fēng)格)。
WS_CHILD:創(chuàng)建一個(gè)子窗口。這個(gè)風(fēng)格不能與WS_POPUP風(fēng)格合用。
WS_CHILDWINDOW:與WS_CHILD相同。
WS_CLIPCHILDREN:當(dāng)在父窗口內(nèi)繪圖時(shí),排除子窗口區(qū)域。在創(chuàng)建父窗口時(shí)使用這個(gè)風(fēng)格。
WS_CLIPSIBLINGS:排除子窗口之間的相對(duì)區(qū)域,也就是,當(dāng)一個(gè)特定的窗口接收到WM_PAINT消息時(shí),WS_CLIPSIBLINGS 風(fēng)格將所有層疊窗口排除在繪圖之外,只重繪指定的子窗口。如果未指定WS_CLIPSIBLINGS風(fēng)格,并且子窗口是層疊的,則在重繪子窗口的客戶區(qū)時(shí),就會(huì)重繪鄰近的子窗口。
WS_DISABLED:創(chuàng)建一個(gè)初始狀態(tài)為禁止的子窗口。一個(gè)禁止?fàn)顟B(tài)的窗口不能接受來自用戶的輸入信息。
WS_DLGFRAME:創(chuàng)建一個(gè)帶對(duì)話框邊框風(fēng)格的窗口。這種風(fēng)格的窗口不能帶標(biāo)題條。
WS_GROUP:指定一組控制的第一個(gè)控制。這個(gè)控制組由第一個(gè)控制和隨后定義的控制組成,自第二個(gè)控制開始每個(gè)控制,具有WS_GROUP風(fēng)格,每個(gè)組的第一個(gè)控制帶有WS_TABSTOP風(fēng)格,從而使用戶可以在組間移動(dòng)。用戶隨后可以使用光標(biāo)在組內(nèi)的控制間改變鍵盤焦點(diǎn)。
WS_HSCROLL:創(chuàng)建一個(gè)有水平滾動(dòng)條的窗口。
WS_ICONIC:創(chuàng)建一個(gè)初始狀態(tài)為最小化狀態(tài)的窗口。與WS_MINIMIZE風(fēng)格相同。
WS_MAXIMIZE:創(chuàng)建一個(gè)初始狀態(tài)為最大化狀態(tài)的窗口。
WS_MAXIMIZEBOX:創(chuàng)建一個(gè)具有最大化按鈕的窗口。該風(fēng)格不能與WS_EX_CONTEXTHELP風(fēng)格同時(shí)出現(xiàn),同時(shí)必須指定WS_SYSMENU風(fēng)格。
WS_OVERLAPPED:產(chǎn)生一個(gè)層疊的窗口。一個(gè)層疊的窗口有一個(gè)標(biāo)題條和一個(gè)邊框。與WS_TILED風(fēng)格相同。
WS_OVERLAPPEDWINDOW:創(chuàng)建一個(gè)具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX風(fēng)格的層疊窗口,與WS_TILEDWINDOW風(fēng)格相同。
WS_POPUP:創(chuàng)建一個(gè)彈出式窗口。該風(fēng)格不能與WS_CHILD風(fēng)格同時(shí)使用。
WS_POPUPWINDOW:創(chuàng)建一個(gè)具有WS_BORDER,WS_POPUP,WS_SYSMENU風(fēng)格的窗口,WS_CAPTION和WS_POPUPWINDOW必須同時(shí)設(shè)定才能使窗口某單可見。
WS_SIZEBOX:創(chuàng)建一個(gè)可調(diào)邊框的窗口,與WS_THICKFRAME風(fēng)格相同。
WS_SYSMENU:創(chuàng)建一個(gè)在標(biāo)題條上帶有窗口菜單的窗口,必須同時(shí)設(shè)定WS_CAPTION風(fēng)格。
WS_TABSTOP:創(chuàng)建一個(gè)控制,這個(gè)控制在用戶按下Tab鍵時(shí)可以獲得鍵盤焦點(diǎn)。按下Tab鍵后使鍵盤焦點(diǎn)轉(zhuǎn)移到下一具有WS_TABSTOP風(fēng)格的控制。
WS_THICKFRAME:創(chuàng)建一個(gè)具有可調(diào)邊框的窗口,與WS_SIZEBOX風(fēng)格相同。
WS_TILED:產(chǎn)生一個(gè)層疊的窗口。一個(gè)層疊的窗口有一個(gè)標(biāo)題和一個(gè)邊框。與WS_OVERLAPPED風(fēng)格相同。
WS_TILEDWINDOW:創(chuàng)建一個(gè)具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX風(fēng)格的層疊窗口。與WS_OVERLAPPEDWINDOW風(fēng)格相同。
WS_VISIBLE:創(chuàng)建一個(gè)初始狀態(tài)為可見的窗口。
WS_VSCROLL:創(chuàng)建一個(gè)有垂直滾動(dòng)條的窗口。
X
指定窗口的初始水平位置。對(duì)一個(gè)層疊或彈出式窗口,X參數(shù)是屏幕坐標(biāo)系的窗口的左上角的初始X坐標(biāo)。對(duì)于子窗口,x是子窗口左上角相對(duì)父窗口客戶區(qū)左上角的初始X坐標(biāo)。如果該參數(shù)被設(shè)為CW_USEDEFAULT則系統(tǒng)為窗口選擇缺省的左上角坐標(biāo)并忽略Y參數(shù)。CW_USEDEFAULT只對(duì)層疊窗口有效,如果為彈出式窗口或子窗口設(shè)定,則X和y參數(shù)被設(shè)為零。
Y
指定窗口的初始垂直位置。對(duì)一個(gè)層疊或彈出式窗口,y參數(shù)是屏幕坐標(biāo)系的窗口的左上角的初始y坐標(biāo)。對(duì)于子窗口,y是子窗口左上角相對(duì)父窗口客戶區(qū)左上角的初始y坐標(biāo)。對(duì)于列表框,y是列表框客戶區(qū)左上角相對(duì)父窗口客戶區(qū)左上角的初始y坐標(biāo)。如果層疊窗口是使用WS_VISIBLE風(fēng)格位創(chuàng)建的并且X參數(shù)被設(shè)為CW_USEDEFAULT,則系統(tǒng)將忽略y參數(shù)。
nWidth
以設(shè)備單元指明窗口的寬度。對(duì)于層疊窗口,nWidth或是屏幕坐標(biāo)的窗口寬度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,則系統(tǒng)為窗口選擇一個(gè)缺省的高度和寬度:缺省寬度為從初始X坐標(biāo)開始到屏幕的右邊界,缺省高度為從初始Y坐標(biāo)開始到目標(biāo)區(qū)域的頂部。CW_USEDEFAULT只對(duì)層疊窗口有效;如果為彈出式窗口和子窗口設(shè)定CW_USEDEFAULT標(biāo)志則nWidth和nHeight被設(shè)為零。
nHeight
以設(shè)備單元指明窗口的高度。對(duì)于層疊窗口,nHeight是屏幕坐標(biāo)的窗口寬度。若nWidth被設(shè)為CW_USEDEFAULT,則系統(tǒng)忽略nHeight參數(shù)。
hWndParent
指向被創(chuàng)建窗口的父窗口或所有者窗口的句柄。若要?jiǎng)?chuàng)建一個(gè)子窗口或一個(gè)被屬窗口,需提供一個(gè)有效的窗口句柄。這個(gè)參數(shù)對(duì)彈出式窗口是可選的。Windows NT 5.0;創(chuàng)建一個(gè)消息窗口,可以提供HWND_MESSAGE或提供一個(gè)己存在的消息窗口的句柄。
hMenu
菜單句柄,或依據(jù)窗口風(fēng)格指明一個(gè)子窗口標(biāo)識(shí)。對(duì)于層疊或彈出式窗口,hMenu指定窗口使用的菜單:如果使用了菜單類,則hMenu可以為NULL。對(duì)于子窗口,hMenu指定了該子窗口標(biāo)識(shí)(一個(gè)整型量),一個(gè)對(duì)話框使用這個(gè)整型值將事件通知父類。應(yīng)用程序確定子窗口標(biāo)識(shí),這個(gè)值對(duì)于相同父窗口的所有子窗口必須是唯一的。
hlnstance
與窗口相關(guān)聯(lián)的模塊實(shí)例的句柄。
lpParam
指向一個(gè)值的指針,該值傳遞給窗口WM_CREATE消息。該值通過在IParam參數(shù)中的CREATESTRUCT結(jié)構(gòu)傳遞。如果應(yīng)用程序調(diào)用CreateWindow創(chuàng)建一個(gè)MDI客戶窗口,則lpParam必須指向一個(gè)CLIENTCREATESTRUCT結(jié)構(gòu)。
返回值:如果函數(shù)成功,返回值為新窗口的句柄:如果函數(shù)失敗,返回值為NULL。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
備注
在返回前,CreateWindow給窗口過程發(fā)送一個(gè)WM_CREATE消息。對(duì)于層疊,彈出式和子窗口,CreateWindow給窗口發(fā)送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。消息WM_CREATE的IParam參數(shù)包含一個(gè)指向CREATESTRUCT結(jié)構(gòu)的指針。如果指定了WS_VISIBLE風(fēng)格,CreateWindow向窗口發(fā)送所有需要激活和顯示窗口的消息。
CreateFont(參數(shù)略)
HFONT CreateFont(
int nHeight, // logical height of font height
int nWidth, // logical average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute flag
DWORD fdwUnderline, // underline attribute flag
DWORD fdwStrikeOut, // strikeout attribute flag
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // pointer to typeface name string
);
DragAcceptFiles
VOID DragAcceptFiles(HWND hWnd, BOOL fAccept);
參數(shù):
hWnd:窗口句柄。
fAccept:true接收拖拽,false拒絕拖拽。
消息
WM_CLOSE&WM_DESTROY&WM_QUIT
WM_CLOSE:關(guān)閉應(yīng)用程序窗口
WM_DESTROY:關(guān)閉應(yīng)用程序
WM_QUIT:關(guān)閉消息循環(huán)
只有關(guān)閉了消息循環(huán),應(yīng)用程序的進(jìn)程才真正退出(在任務(wù)管理器里消失)。
win32應(yīng)用程序的完整退出過程:點(diǎn)擊窗口右上角的關(guān)閉按鈕,發(fā)送WM_CLOSE消息。此消息處理中調(diào)用DestroyWindow函數(shù),發(fā)送WM_DESTROY消息。此消息處理中調(diào)用PostQuitMessage(0)函數(shù),發(fā)送WM_QUIT消息到消息隊(duì)列中。GetMessage捕獲到WM_QUIT,返回0,退出循環(huán)(應(yīng)用程序真正退出)。
MFC等待補(bǔ)充
WM_SIZE
當(dāng)主窗口的客戶區(qū)部分大小改變時(shí),我們的應(yīng)用程序?qū)⒔邮盏?WM_SIZE 消息。當(dāng)然該窗口第一次顯示時(shí),我們也將接收到該消息。我們應(yīng)該把縮放編輯控件的動(dòng)作放到此處。我們要把編輯控件變成和我們的窗口客戶區(qū)一樣大,所以先得要得到父窗口客戶區(qū)的大小。這些值包含在參數(shù) lParam 中, lParam 的高字部分是客戶區(qū)的高,低字部分是客戶區(qū)的寬。然后我們調(diào)用 MoveWindow 函數(shù)來重新調(diào)整編輯控件的大小,該函數(shù)不僅能夠移動(dòng)窗口的位置,而且能夠改變窗口的大小。
引用的來源:
1.https://blog.csdn.net/fbmly/article/details/5442965
2.百度百科