1.結構原型
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
2.參數說明
STARTUPINFO結構 該結構用于指定新進程的主窗口特性
DWORD cb; //包含STARTUPINFO結構中的字節數.如果Microsoft將來擴展該結構,它可用作版本控制手段.
應用程序必須將cb初始化為sizeof(STARTUPINFO)
PSTR lpReserved; //保留。必須初始化為N U L L
PSTR lpDesktop; //用于標識啟動應用程序所在的桌面的名字。如果該桌面存在,新進程便與指定的桌面相關聯。
如果桌面不存在,便創建一個帶有默認屬性的桌面,并使用為新進程指定的名字。
如果lpDesktop是NULL(這是最常見的情況),那么該進程將與當前桌面相關聯
PSTR lpTitle; //用于設定控制臺窗口的名稱。如果l p Ti t l e 是N U L L ,則可執行文件的名字將用作窗口名
DWORD dwX; //用于設定應用程序窗口在屏幕上應該放置的位置的x 和y 坐標(以像素為單位)。
DWORD dwY; 只有當子進程用CW_USEDEFAULT作為CreateWindow的x參數來創建它的第一個重疊窗口時,
才使用這兩個坐標。若是創建控制臺窗口的應用程序,這些成員用于指明控制臺窗口的左上角
DWORD dwXSize; //用于設定應用程序窗口的寬度和長度(以像素為單位)只有dwYsize
DWORD dwYSize; 當子進程將C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的
n Wi d t h參數來創建它的第一個重疊窗口時,才使用這些值。
若是創建控制臺窗口的應用程序,這些成員將用于指明控制臺窗口的寬度
DWORD dwXCountChars; //用于設定子應用程序的控制臺窗口的寬度和高度(以字符為單位)
DWORD dwYCountChars;
DWORD dwFillAttribute; //用于設定子應用程序的控制臺窗口使用的文本和背景顏色
DWORD dwFlags; //請參見下一段和表4 - 7 的說明
WORD wShowWindow; //用于設定如果子應用程序初次調用的S h o w Wi n d o w 將S W _ S H O W D E FA U LT 作為
n C m d S h o w 參數傳遞時,該應用程序的第一個重疊窗口應該如何出現。
本成員可以是通常用于Show Wi n d o w 函數的任何一個S W _ *標識符
WORD cbReserved2; //保留。必須被初始化為0
PBYTE lpReserved2; //保留。必須被初始化為N U L L
HANDLE hStdInput; //用于設定供控制臺輸入和輸出用的緩存的句柄。
按照默認設置,h S t d I n p u t 用于標識鍵盤緩存,
h S t d O u t p u t 和h S t d E r r o r用于標識控制臺窗口的緩存
HANDLE hStdOutput;
HANDLE hStdError;
當Wi n d o w s 創建新進程時,它將使用該結構的有關成員。大多數應用程序將要求生成的應用程序僅僅使用默認值。至少應該將該結構中的所有成員初始化為零,然后將c b 成員設置為該結構的大小:
STARTUPINFO si = { sizeof(si) };
CreateProcess(...,&si,...);
表4-7 dwFlags 使用標志及含義
標志 含義
STARTF_USESIZE // 使用d w X S i z e 和d w Y S i z e 成員
STARTF_USESHOWWINDOW //使用w S h o w Wi n d o w 成員
STARTF_USEPOSITION //使用d w X 和d w Y 成員
STARTF_USECOUNTCHARS //使用d w X C o u n t C h a r s 和dwYCount Chars 成員
STARTF_USEFILLATTRIBUTE //使用d w F i l l A t t r i b u t e 成員
STARTF_USESTDHANDLES //使用h S t d I n p u t 、h S t d O u t p u t 和h S t d E r r o r 成員
STARTF_RUN_FULLSCREEN //強制在x 8 6 計算機上運行的控制臺應用程序以全屏幕方式啟動運行
另外還有兩個標志,即STARTF_FORCEONFEEDBACK 和STARTF_+FORCEOFFF -EEDBACK ,當啟動一個新進程時,它們可以用來控制鼠標的光標。由于Windows支持真正的多任務搶占式運行方式,因此可以啟動一個應用程序,然后在進程初始化時,使用另一個程序。為了向用戶提供直觀的反饋信息,C r e a t e P r o c e s s 能夠臨時將系統的箭頭光標改為一個新光標,即沙漏箭頭光標:
該光標表示可以等待出現某種情況,也可以繼續使用系統。當啟動另一個進程時,CreateProcess函數使你能夠更好地控制光標。當設定STARTF_FORCEONFEEDBACK標志時,C r e a t e P r o c e s s 并不將光標改為沙漏。
STARTF_FORCEONFEEDBACK可使CreateProcess能夠監控新進程的初始化,并可根據結果來改變光標。當使用該標志來調用CreateProcess時,光標改為沙漏。過2 s 后,如果新進程沒有調用G U I ,CreateProcess 將光標恢復為箭頭。
如果該進程在2 s 內調用了GUI ,CreateProcess將等待該應用程序顯示一個窗口。這必須在進程調用G U I 后5 s內發生。如果沒有顯示窗口,CreateProcess就會恢復原來的光標。如果顯示了一個窗口,CreateProcess將使沙漏光標繼續保留5s 。如果某個時候該應用程序調用了G e t M e s s a g e 函數,指明它完成了初始化,那么C r e a t e P r o ce s s 就會立即恢復原來的光標,并且停止監控新進程。
在結束這一節內容的介紹之前,我想講一講S TA RT U P I N F O 的w S h o w Wi n d o w成員。你將該成員初始化為傳遞給( w ) Wi n M a i n 的最后一個參數n C m d S h o w的值。該成員顯示你想要傳遞給新進程的( w ) Wi n M a i n 函數的最后一個參數n C m d S h o w的值。它是可以傳遞給S h o w Wi n d o w 函數的標識符之一。通常,n C m d S h o w 的值既可以是S W _ SH O W N O R M A L ,也可以是SW_ SHOWMINNOACTIVE 。但是,它有時可以是S W _ S H O W D EFA U LT 。
當在E x p l o r e r 中啟動一個應用程序時,該應用程序的( w ) Wi n M a i n 函數被調用,而S W _ SH O W N O R M A L 則作為n C m d S h o w參數來傳遞。如果為該應用程序創建了一個快捷方式,可以使用快捷方式的屬性頁來告訴系統,應用程序的窗口最初應該如何顯示。圖4 - 3 顯示了運行No t e p a d 的快捷方式的屬性頁。注意,使用R u n 選項的組合框,就能夠設定如何顯示N o t e p a d 的窗口。
當使用E x p l o r e r 來啟動該快捷方式時,E x p l o r e r 會正確地準備S TA RT U P I N FO 結構并調用C r e a t e P r o c e s s 。這時N o t e p a d 開始運行,并且為n C m d S h ow 參數將S W _ S H O W M I N N O A C T I V E傳遞給它的( w ) Wi n M a i n 函數。
運用這樣的方法,用戶能夠很容易地啟動一個應用程序,其主窗口可以用正常狀態、最小或最大狀態進行顯示。
最后,應用程序可以調用下面的函數,以便獲取由父進程初始化的S TA RT U P I N F O 結構的拷貝。子進程可以查看該結構,并根據該結構的成員的值來改變它的行為特性。
VOID GetStartupInfo(LPSTARTUPINFO pStartupInfo);
注意雖然Wi n d o w s 文檔沒有明確地說明,但是在調用G e t S t a r t I n f o 函數之前,必須像下面這樣對該結構的c b 成員進行初始化:
STARTUPINFO si = { sizeof(si) };
GetStartupInfo(&si);