STARTUPINFOW 结构 (processthreadsapi.h)

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

语法

typedef struct _STARTUPINFOW {
  DWORD  cb;
  LPWSTR lpReserved;
  LPWSTR lpDesktop;
  LPWSTR 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;
} STARTUPINFOW, *LPSTARTUPINFOW;

成员

cb

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

lpReserved

保留;必须为 NULL。

lpDesktop

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

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

lpTitle

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

dwX

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

偏移量来自屏幕左上角。 对于 GUI 进程,在新进程首次调用 createWindow 时,将使用指定的位置来创建重叠窗口(如果 CreateWindowx 参数CW_USEDEFAULT)。

dwY

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

偏移量来自屏幕左上角。 对于 GUI 进程,在新进程首次调用 CreateWindow 时,将使用指定的位置来创建重叠窗口(如果 CreateWindowy 参数CW_USEDEFAULT)。

dwXSize

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

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

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。 此标识符控制任务栏和 “开始”菜单呈现应用程序的方式,并使它能够与正确的快捷方式和跳转列表相关联。 通常,应用程序将使用 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,则此成员可以是 nCmdShow 参数中为 ShowWindow 函数指定的任何值,但SW_SHOWDEFAULT除外。 否则,将忽略此成员。

对于 GUI 进程,ShowWindow 首次调用时,nCmdShow 参数将被忽略 wShowWindow 指定默认值。 在对 ShowWindow的后续调用中 ,如果将 nCmdShowShowWindownCmdShow 参数设置为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”的 GUI 进程。

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

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

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

例子

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

#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 上的 Windows.h)

另请参阅

CreateProcess

CreateProcessAsUser

CreateProcessWithLogonW

CreateProcessWithTokenW

GetStartupInfo