STARTUPINFOA 结构 (processthreadsapi.h)

指定创建时进程的窗口工作站、桌面、标准句柄和main窗口的外观。

语法

typedef struct _STARTUPINFOA {
  DWORD  cb;
  LPSTR  lpReserved;
  LPSTR  lpDesktop;
  LPSTR  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;
} STARTUPINFOA, *LPSTARTUPINFOA;

成员

cb

结构大小(以字节为单位)。

lpReserved

保留;必须为 NULL。

lpDesktop

桌面的名称,或此过程的桌面和窗口工作站的名称。 字符串中的反斜杠指示字符串同时包含桌面和窗口工作站名称。

有关详细信息,请参阅 与桌面的线程连接

lpTitle

对于控制台进程,这是在创建新的控制台窗口时显示在标题栏中的标题。 如果为 NULL,则可执行文件的名称将改为用作窗口标题。 对于不创建新控制台窗口的 GUI 或控制台进程,此参数必须为 NULL。

dwX

如果 dwFlags 指定STARTF_USEPOSITION,则此成员是创建新窗口时窗口左上角的 x 偏移量(以像素为单位)。 否则,将忽略此成员。

偏移量从屏幕左上角开始。 对于 GUI 进程,如果 createWindowx 参数CW_USEDEFAULT,则新进程首次调用 CreateWindow 以创建重叠窗口时使用指定位置。

dwY

如果 dwFlags 指定STARTF_USEPOSITION,则此成员是创建新窗口时窗口左上角的 y 偏移量(以像素为单位)。 否则,将忽略此成员。

偏移量从屏幕左上角开始。 对于 GUI 进程,如果 createWindowy 参数CW_USEDEFAULT,则新进程首次调用 CreateWindow 以创建重叠窗口时使用指定位置。

dwXSize

如果 dwFlags 指定STARTF_USESIZE,则此成员是创建新窗口时窗口的宽度(以像素为单位)。 否则,将忽略此成员。

对于 GUI 进程,如果 createWindownWidth 参数CW_USEDEFAULT,则仅在新进程首次调用 CreateWindow 来创建重叠窗口时,才使用此方法。

dwYSize

如果 dwFlags 指定STARTF_USESIZE,则此成员是创建新窗口时窗口的高度(以像素为单位)。 否则,将忽略此成员。

对于 GUI 进程,如果 createWindownHeight 参数CW_USEDEFAULT,则仅在新进程首次调用 CreateWindow 以创建重叠窗口时使用。

dwXCountChars

如果 dwFlags 指定STARTF_USECOUNTCHARS,如果在控制台进程中创建新的控制台窗口,则此成员以字符列为单位指定屏幕缓冲区宽度。 否则,将忽略此成员。

dwYCountChars

如果 dwFlags 指定STARTF_USECOUNTCHARS,如果在控制台进程中创建新的控制台窗口,则此成员以字符行为单位指定屏幕缓冲区高度。 否则,将忽略此成员。

dwFillAttribute

如果 dwFlags 指定STARTF_USEFILLATTRIBUTE,则如果在控制台应用程序中创建新的控制台窗口,则此成员为初始文本和背景色。 否则,将忽略此成员。

此值可以是以下值的任意组合:FOREGROUND_BLUE、FOREGROUND_GREEN、FOREGROUND_RED、FOREGROUND_INTENSITY、BACKGROUND_BLUE、BACKGROUND_GREEN、BACKGROUND_RED和BACKGROUND_INTENSITY。 例如,以下值组合在白色背景上生成红色文本:

FOREGROUND_RED| BACKGROUND_RED| BACKGROUND_GREEN| BACKGROUND_BLUE

dwFlags

确定进程创建窗口时是否使用某些 STARTUPINFO 成员的位域。 此成员可以是以下一个或多个值。

含义
STARTF_FORCEONFEEDBACK
0x00000040
指示在调用 CreateProcess 后光标处于反馈模式两秒钟。 显示“在后台工作”光标 (查看鼠标控制面板实用工具) 中的“指针”选项卡。

如果在这两秒内进程进行第一次 GUI 调用,则系统会再给进程 5 秒。 如果在这五秒内进程显示一个窗口,则系统再给进程 5 秒以完成绘制窗口。

系统在第一次调用 GetMessage 后关闭反馈光标,无论进程是否正在绘制。

STARTF_FORCEOFFFEEDBACK
0x00000080
指示在进程启动时强制关闭反馈光标。 将显示“普通选择”光标。
STARTF_PREVENTPINNING
0x00002000
指示进程创建的任何窗口都不能固定在任务栏上。

此标志必须与 STARTF_TITLEISAPPID 组合使用。

STARTF_RUNFULLSCREEN
0x00000020
指示进程应在全屏模式下运行,而不是在窗口模式下运行。

此标志仅对 x86 计算机上运行的控制台应用程序有效。

STARTF_TITLEISAPPID
0x00001000
lpTitle 成员包含 AppUserModelID。 此标识符控制任务栏和“开始”菜单显示应用程序的方式,并使它能够与正确的快捷方式和跳转Lists相关联。 通常,应用程序将使用 SetCurrentProcessExplicitAppUserModelIDGetCurrentProcessExplicitAppUserModelID 函数,而不是设置此标志。 有关详细信息,请参阅 应用程序用户模型 ID

如果使用STARTF_PREVENTPINNING,则应用程序窗口不能固定在任务栏上。 应用程序使用与 AppUserModelID 相关的任何窗口属性仅覆盖该窗口的此设置。

此标志不能与STARTF_TITLEISLINKNAME一起使用。

STARTF_TITLEISLINKNAME
0x00000800
lpTitle 成员包含用户为启动此过程而调用的快捷方式文件 (.lnk) 的路径。 这通常是在调用指向启动的应用程序的.lnk文件时由 shell 设置的。 大多数应用程序不需要设置此值。

此标志不能与STARTF_TITLEISAPPID一起使用。

STARTF_UNTRUSTEDSOURCE
0x00008000
命令行来自不受信任的源。 有关详细信息,请参阅“备注”。
STARTF_USECOUNTCHARS
0x00000008
dwXCountCharsdwYCountChars 成员包含其他信息。
STARTF_USEFILLATTRIBUTE
0x00000010
dwFillAttribute 成员包含其他信息。
STARTF_USEHOTKEY
0x00000200
hStdInput 成员包含其他信息。

此标志不能与 STARTF_USESTDHANDLES一起使用。

STARTF_USEPOSITION
0x00000004
dwXdwY 成员包含其他信息。
STARTF_USESHOWWINDOW
0x00000001
wShowWindow 成员包含其他信息。
STARTF_USESIZE
0x00000002
dwXSizedwYSize 成员包含其他信息。
STARTF_USESTDHANDLES
0x00000100
hStdInputhStdOutputhStdError 成员包含其他信息。

如果在调用其中一个进程创建函数时指定此标志,则句柄必须是可继承的,并且函数的 bInheritHandles 参数必须设置为 TRUE。 有关详细信息,请参阅 处理继承

如果在调用 GetStartupInfo 函数时指定此标志,则这些成员要么是在进程创建期间指定的句柄值,要么INVALID_HANDLE_VALUE。

当不再需要句柄时,必须使用 CloseHandle 关闭这些句柄。

此标志不能与 STARTF_USEHOTKEY一起使用。

wShowWindow

如果 dwFlags 指定STARTF_USESHOWWINDOW,则此成员可以是可在 ShowWindow 函数的 nCmdShow 参数中指定的任何值,SW_SHOWDEFAULT除外。 否则,将忽略此成员。

对于 GUI 进程,首次调用 ShowWindow 时,忽略其 nCmdShow 参数 wShowWindow 指定默认值。 在对 ShowWindow 的后续调用中,如果将 ShowWindownCmdShow 参数设置为 SW_SHOWDEFAULT,则使用 wShowWindow 成员。

cbReserved2

保留供 C 运行时使用;必须为零。

lpReserved2

保留供 C 运行时使用;必须为 NULL。

hStdInput

如果 dwFlags 指定STARTF_USESTDHANDLES,则此成员是进程的标准输入句柄。 如果未指定STARTF_USESTDHANDLES,则标准输入的默认值为键盘缓冲区。

如果 dwFlags 指定STARTF_USEHOTKEY,则此成员将指定一个热键值,该值作为WM_SETHOTKEY消息的 wParam 参数发送到拥有进程的应用程序创建的第一个符合条件的顶级窗口。 如果窗口是使用WS_POPUP窗口样式创建的,则它不符合条件,除非还设置了WS_EX_APPWINDOW扩展窗口样式。 有关详细信息,请参阅 CreateWindowEx

否则,将忽略此成员。

hStdOutput

如果 dwFlags 指定STARTF_USESTDHANDLES,则此成员是进程的标准输出句柄。 否则,将忽略此成员,标准输出的默认值为控制台窗口的缓冲区。

如果进程是从任务栏或跳转列表启动的,系统会将 hStdOutput 设置为包含用于启动进程的任务栏或跳转列表的监视器的句柄。 有关详细信息,请参阅备注。Windows 7、Windows Server 2008 R2、Windows Vista、Windows Server 2008、Windows XP 和 Windows Server 2003: Windows 8和Windows Server 2012中引入了此行为。

hStdError

如果 dwFlags 指定STARTF_USESTDHANDLES,则此成员是进程的标准错误句柄。 否则,将忽略此成员,标准错误的默认值为控制台窗口的缓冲区。

注解

对于图形用户界面 (GUI) 进程,此信息会影响 CreateWindow 函数创建并由 ShowWindow 函数显示的第一个窗口。 对于控制台进程,如果为进程创建了新的控制台,此信息将影响控制台窗口。 进程可以使用 GetStartupInfo 函数检索创建进程时指定的 STARTUPINFO 结构。

如果正在启动 GUI 进程,并且未指定STARTF_FORCEONFEEDBACK或STARTF_FORCEOFFFEEDBACK,则使用进程反馈游标。 GUI 进程是其子系统指定为“windows”的进程。

如果从任务栏或跳转列表启动某个进程,系统会设置 GetStartupInfo 以检索 STARTUPINFO 结构,并检查设置 hStdOutput。 如果是,请使用 GetMonitorInfo 检查 hStdOutput 是否是 HMONITOR) (有效的监视器句柄。 然后,进程可以使用句柄定位其窗口。

如果指定 了 STARTF_UNTRUSTEDSOURCE 标志,则应用程序应注意命令行不受信任。 如果设置了此标志,应用程序应禁用潜在的危险功能,例如宏、下载的内容和自动打印。 此标志是可选的,但建议调用 CreateProcess 的应用程序在启动具有不受信任的命令行参数的程序时设置此标志, (如 Web 内容) 提供的命令行参数,以便新创建的进程可以应用适当的策略。

从 Windows Vista 开始支持STARTF_UNTRUSTEDSOURCE标志,但在Windows 10 SDK 之前的 SDK 头文件中未定义它。 若要在Windows 10之前的版本中使用该标志,可以在程序中手动定义它。

示例

下面的代码示例演示如何使用 StartUpInfoA

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

有关此示例的详细信息,请参阅 创建进程

注意

processthreadsapi.h 标头将 STARTUPINFO 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
标头 processthreadsapi.h (包括 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)

另请参阅

CreateProcess

CreateProcessAsUser

CreateProcessWithLogonW

CreateProcessWithTokenW

GetStartupInfo