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

WinMain

鎖定
WinMain是一個函數,該函數的功能是被系統調用,作為一個32位應用程序的入口點。WinMain函數應初始化應用程序,顯示主窗口,進入一個消息接收一發送循環,這個循環是應用程序執行的其餘部分的頂級控制結構。
外文名
WinMain
類    別
函數
功    能
系統調用
作    為
32位應用程序入口點

WinMain函數原型

//使用Ansi字符

int _stdcall WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)

//使用UNICODE字符

int _stdcall wWinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow
)

//可寫為

int APIENTRY WinMain...

int WINAPI WinMain...

int CALLBACK WinMain...

//因為 (在minwindef.h中)

#define CALLBACK    __stdcall

#define WINAPI      __stdcall

#define APIENTRY    WINAPI
hinstance:應用程序當前實例的句柄。
hPrevlnstance:應用程序的先前實例的句柄。對於同一個程序打開兩次,出現兩個窗口第一次打開的窗口就是先前實例的窗口。對於一個32位程序,該參數總為NULL
如果需要檢測另外一個實例是否已經存在,則使用CreateMutex函數創建一個獨一無二的名字。即使互斥名已經存在,CreateMutex函數也是成功的,但是GetLastError函數將返回 ERROR_ALREADY_EXISTS,這就表明應用程序有另外一個實例存在,因為它首先創建了互斥名。
lpCmdLine:指向應用程序命令行的字符串的指針,不包括執行文件名。獲得整個命令行,參看GetCommandLine
第三個參數lpCmdLine是一個以空終止的字符串,指定傳遞給應用程序的命令行參數。例如:在D盤下有一個sunxin.txt文件,當我們用鼠標雙擊這個文件時將啓動記事本程序(notepad.exe),此時系統會將D:\sunxin.txt作為命令行參數傳遞給記事本程序的WinMain函數,記事本程序在得到這個文件的全路徑名後,就在窗口中顯示該文件的內容。要在VC++開發環境中嚮應用程序傳遞參數,可以單擊菜單【Project】→【Settings】,選擇“Debug”選項卡,在“Program arguments”編輯框中輸入你想傳遞給應用程序的參數。
nCmdShow:指明窗口如何顯示。該參數可以是下列值之一:
SW_HIDE:隱藏窗口並且激活另外一個窗口。
SW_MINIMIZE:最小化指定的窗口,並且激活在系統表中的頂層窗口。
SW_RESTORE:激活並顯示窗口。如果窗口已經最小化或最大化,系統將以恢復到原來的尺寸和位置顯示窗口(與SW_SHOWNORMAL相同)。
SW_SHOW:激活一個窗口並以原來的尺寸和位置顯示窗口。
SW_SHOWMAXIMIZED:激活窗口並且將其最大化。
SW_SHOWMINIMIZED:激活窗口並將其最小化(以圖標顯示)。
SW_SHOWMINNOACTIVE:將一個窗口顯示為圖標。激活窗口維持活動狀態。
SW_SHOWNA:以窗口的當前狀態顯示窗口。激活窗口保持活動狀態。
SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置顯示窗口。不激活窗口。
SW_SHOWNORMAL:激活並顯示窗口。如果窗口最大化或最小化,系統將其恢復到原來的尺寸和位置(與SW_RESTORE相同)。

WinMain消息

//於WinUser.h中
#define WM_SETFOCUS                     0x0007
#define WM_KILLFOCUS                    0x0008
#define WM_ENABLE                       0x000A
#define WM_SETREDRAW                    0x000B
#define WM_SETTEXT                      0x000C
#define WM_GETTEXT                      0x000D
#define WM_GETTEXTLENGTH                0x000E
#define WM_PAINT                        0x000F
#define WM_CLOSE                        0x0010
#ifndef _WIN32_WCE
#define WM_QUERYENDSESSION              0x0011
#define WM_QUERYOPEN                    0x0013
#define WM_ENDSESSION                   0x0016
#endif
#define WM_QUIT                         0x0012
#define WM_ERASEBKGND                   0x0014
#define WM_SYSCOLORCHANGE               0x0015
#define WM_SHOWWINDOW                   0x0018
#define WM_WININICHANGE                 0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE                WM_WININICHANGE
#endif /* WINVER >= 0x0400 */


#define WM_DEVMODECHANGE                0x001B
#define WM_ACTIVATEAPP                  0x001C
#define WM_FONTCHANGE                   0x001D
#define WM_TIMECHANGE                   0x001E
#define WM_CANCELMODE                   0x001F
#define WM_SETCURSOR                    0x0020
#define WM_MOUSEACTIVATE                0x0021
#define WM_CHILDACTIVATE                0x0022
#define WM_QUEUESYNC                    0x0023

#define WM_GETMINMAXINFO                0x0024

#define WM_PAINTICON                    0x0026
#define WM_ICONERASEBKGND               0x0027
#define WM_NEXTDLGCTL                   0x0028
#define WM_SPOOLERSTATUS                0x002A
#define WM_DRAWITEM                     0x002B
#define WM_MEASUREITEM                  0x002C
#define WM_DELETEITEM                   0x002D
#define WM_VKEYTOITEM                   0x002E
#define WM_CHARTOITEM                   0x002F
#define WM_SETFONT                      0x0030
#define WM_GETFONT                      0x0031
#define WM_SETHOTKEY                    0x0032
#define WM_GETHOTKEY                    0x0033
#define WM_QUERYDRAGICON                0x0037
#define WM_COMPAREITEM                  0x0039
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_GETOBJECT                    0x003D
#endif
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING                   0x0041
#define WM_COMMNOTIFY                   0x0044 
#define WM_WINDOWPOSCHANGING            0x0046
#define WM_WINDOWPOSCHANGED             0x0047

#define WM_POWER                        0x0048



返回值
如果函數成功,當它接收到一個WM_QUIT消息時就中止,函數應該返回在該消息的wParam參數的退出值。如果函數在進入消息循環前退出,應該返回零。

WinMain其他信息

當接收到一個WM_QUIT消息時,程序就中止。這時,WinMain函數應退出應用程序,並且返回傳遞給WM_QUIT消息的wParam參數的值。如果由於調用PostQuitMessage函數而接收到WM_QUIT消息,wParam的值是PostQuitMessage函數的nExitCode的值。請參看“創建一個窗口循環”。
ANSI應用程序可以使用WinMain函數的lpCmdLine參數進入命令行字符串(除了程序名之外)。WinMain不能返回Unicode字符串的原因是IpCmdLine使用的是LPSTR數據類型,而不是LPTSTR類型。GetCommandLine函數可以用於進入命令行的Unicode字符串,因為它使用的是LPTSTR類型。
Windows CE:Windows CE不支持下列 nCmdLine參數值:
SW_MINIMIZE;SW_RESTORE;SW_RESTORE;SW_SHOWMAXMIZED
SW_SHOWMINIMIZED;SW_SHOWMINNOACTIVE

WinMain速查

Windows NT:3.1以上版本;Windows:95以上版本:Windows CE:1.0以上版本;頭文件:Winbase.h庫文件:用户自定義。