• [转载] 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;  // 当子进程将CW_USEDEFAULT 用作CreateWindow 的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度
        DWORD dwXCountChars;  //用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
        DWORD dwYCountChars;
        DWORD dwFillAttribute;   //用于设定子应用程序的控制台窗口使用的文本和背景颜色
        DWORD dwFlags;           //请参见下一段和表4 - 7 的说明
        WORD wShowWindow;        //用于设定如果子应用程序初次调用的ShowWindow 将SW_SHOWDEFAULT 作为    nCmdShow 参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是通常用于ShowWindow 函数的任何一个SW_*标识符
        WORD cbReserved2;        //保留。必须被初始化为0
        PBYTE lpReserved2;       //保留。必须被初始化为N U L L
        HANDLE hStdInput;        //用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,hStdInput 用于标识键盘缓存,hStdOutput 和hStdError用于标识控制台窗口的缓存
        HANDLE hStdOutput;
        HANDLE hStdError;
    } STARTUPINFO, *LPSTARTUPINFO;
    当Windows 创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将c b 成员设置为该结构的大小:
    STARTUPINFO si = { sizeof(si) };
    CreateProcess(...,&si,...);

    表4-7 dwFlags 使用标志及含义
    标志                                    含义
    STARTF_USESIZE                 // 使用dwXSize 和dwYSize 成员
    STARTF_USESHOWWINDOW              //使用wShowWindow 成员
    STARTF_USEPOSITION              //使用dwX 和dwY 成员
    STARTF_USECOUNTCHARS                //使用dwXCountChars 和dwYCount Chars 成员
    STARTF_USEFILLATTRIBUTE          //使用dwFillAttribute 成员
    STARTF_USESTDHANDLES              //使用hStdInput 、hStdOutput 和hStdError 成员
    STARTF_RUN_FULLSCREEN              //强制在x86 计算机上运行的控制台应用程序以全屏幕方式启动运行


    另外还有两个标志,即STARTF_FORCEONFEEDBACK 和STARTF_+FORCEOFFF -EEDBACK ,当启动一个新进程时,它们可以用来控制鼠标的光标。由于Windows支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时,使用另一个程序。为了向用户提供直观的反馈信息,CreateProcess 能够临时将系统的箭头光标改为一个新光标,即沙漏箭头光标:

    该光标表示可以等待出现某种情况,也可以继续使用系统。当启动另一个进程时,CreateProcess函数使你能够更好地控制光标。当设定 STARTF_FORCEONFEEDBACK标志时,CreateProcess 并不将光标改为沙漏。

    STARTF_FORCEONFEEDBACK可使CreateProcess能够监控新进程的初始化,并可根据结果来改变光标。当使用该标志来调用CreateProcess时,光标改为沙漏。过2 s 后,如果新进程没有调用GUI ,CreateProcess 将光标恢复为箭头。

    如果该进程在2 s 内调用了GUI ,CreateProcess将等待该应用程序显示一个窗口。这必须在进程调用GUI 后5s 内发生。如果没有显示窗口,CreateProcess就会恢复原来的光标。如果显示了一个窗口,CreateProcess将使沙漏光标继续保留5 s 。如果某个时候该应用程序调用了GetMessage 函数,指明它完成了初始化,那么CreateProcess 就会立即恢复原来的光标,并且停止监控新进程。

    在结束这一节内容的介绍之前,我想讲一讲STARTUPINFO 的wShowWindow 成员。你将该成员初始化为传递给(w)WinMain 的最后一个参数nCmdShow 的值。该成员显示你想要传递给新进程的(w)WinMain 函数的最后一个参数nCmdShow 的值。它是可以传递给ShowWindow 函数的标识符之一。通常,nCmdShow 的值既可以是SW_SHOWNORMAL ,也可以是SW_ SHOWMINNOACTIVE 。但是,它有时可以是SW_SHOWDEFAULT 。

    当在Explorer 中启动一个应用程序时,该应用程序的(w)WinMain 函数被调用,而SW_SHOWNORMAL 则作为nCmdShow 参数来传递。如果为该应用程序创建了一个快捷方式,可以使用快捷方式的属性页来告诉系统,应用程序的窗口最初应该如何显示。图4 - 3 显示了运行Notepad 的快捷方式的属性页。注意,使用Run 选项的组合框,就能够设定如何显示Notepad 的窗口。

    当使用Explorer 来启动该快捷方式时,Explorer 会正确地准备STARTUPINFO 结构并调用CreateProcess 。这时Notepad 开始运行,并且为nCmdShow 参数将SW_SHOWMINNOACTIVE传递给它的(w)WinMain 函数。

    运用这样的方法,用户能够很容易地启动一个应用程序,其主窗口可以用正常状态、最小或最大状态进行显示。

    最后,应用程序可以调用下面的函数,以便获取由父进程初始化的STARTUPINFO 结构的拷贝。子进程可以查看该结构,并根据该结构的成员的值来改变它的行为特性。

    VOID GetStartupInfo(LPSTARTUPINFO pStartupInfo);
    注意虽然Windows 文档没有明确地说明,但是在调用GetStartInfo 函数之前,必须像下面这样对该结构的cb 成员进行初始化:
    STARTUPINFO si = { sizeof(si) };
    GetStartupInfo(&si);

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/arsblog/p/4560282.html
Copyright © 2020-2023  润新知