STARTUPINFO详解
typedef struct _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;
} STARTUPINFO, *LPSTARTUPINFO;
当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将使沙漏光标继续保留5 s 。如果某个时候该应⽤程序调⽤了G e t M e s s a g e 函数,指明它完成了初始化,那么C r e a t e P r o c e 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 _ S H O W N O R M A L ,也可以是SW_ SHOWMINNOACTIVE 。但是,它有时可以是S W _ S H O W D E FA U LT 。
当在E x p l o r e r 中启动⼀个应⽤程序时,该应⽤程序的( w ) Wi n M a i n 函数被调⽤,⽽S W _ S H O W N O R M A L 则作为n C
m d S h o w 参数来传递。如果为该应⽤程序创建了⼀个快捷⽅式,可以使⽤快捷⽅式的属性页来告诉系统,应⽤程序的窗⼝最初应该如何显⽰。图4 - 3 显⽰了运⾏N o 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 F O 结构并调⽤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 o w 参数将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 结构的拷贝。⼦进程可以查看该结构,并根据该结构的成员的值来改变它的⾏为特性。
createprocessaVOID 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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论