From 5d92ccce9466dbfe8a613d0ee5ded1a959014554 Mon Sep 17 00:00:00 2001 From: Shane Holloway Date: Tue, 27 Nov 2012 16:48:01 +0100 Subject: [PATCH] windows: add flag for hiding windows created by a spawned process Closes GH-627 --- include/uv.h | 8 +++++++- src/unix/process.c | 7 ++++--- src/win/process.c | 18 ++++++++++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/uv.h b/include/uv.h index b187d6cb..2f17ba3b 100644 --- a/include/uv.h +++ b/include/uv.h @@ -1314,7 +1314,13 @@ enum uv_process_flags { * parent's event loop alive unless the parent process calls uv_unref() on * the child's process handle. */ - UV_PROCESS_DETACHED = (1 << 3) + UV_PROCESS_DETACHED = (1 << 3), + /* + * Hide the subprocess console window that would normally be created. This + * option is only meaningful on Windows systems. On unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE = (1 << 4) }; /* diff --git a/src/unix/process.c b/src/unix/process.c index 9ff722c0..ba6df657 100644 --- a/src/unix/process.c +++ b/src/unix/process.c @@ -363,10 +363,11 @@ int uv_spawn(uv_loop_t* loop, int i; assert(options.file != NULL); - assert(!(options.flags & ~(UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | - UV_PROCESS_DETACHED | + assert(!(options.flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | - UV_PROCESS_SETUID))); + UV_PROCESS_SETUID | + UV_PROCESS_WINDOWS_HIDE | + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); ngx_queue_init(&process->queue); diff --git a/src/win/process.c b/src/win/process.c index 8d22e742..c5649d3a 100644 --- a/src/win/process.c +++ b/src/win/process.c @@ -777,10 +777,11 @@ int uv_spawn(uv_loop_t* loop, uv_process_t* process, } assert(options.file != NULL); - assert(!(options.flags & ~(UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | - UV_PROCESS_DETACHED | + assert(!(options.flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | - UV_PROCESS_SETUID))); + UV_PROCESS_SETUID | + UV_PROCESS_WINDOWS_HIDE | + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); uv_process_init(loop, process); process->exit_cb = options.exit_cb; @@ -872,13 +873,22 @@ int uv_spawn(uv_loop_t* loop, uv_process_t* process, startup.lpReserved = NULL; startup.lpDesktop = NULL; startup.lpTitle = NULL; - startup.dwFlags = STARTF_USESTDHANDLES; + startup.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + startup.cbReserved2 = uv__stdio_size(process->child_stdio_buffer); startup.lpReserved2 = (BYTE*) process->child_stdio_buffer; + startup.hStdInput = uv__stdio_handle(process->child_stdio_buffer, 0); startup.hStdOutput = uv__stdio_handle(process->child_stdio_buffer, 1); startup.hStdError = uv__stdio_handle(process->child_stdio_buffer, 2); + if (options.flags & UV_PROCESS_WINDOWS_HIDE) { + /* Use SW_HIDE to avoid any potential process window. */ + startup.wShowWindow = SW_HIDE; + } else { + startup.wShowWindow = SW_SHOWDEFAULT; + } + process_flags = CREATE_UNICODE_ENVIRONMENT; if (options.flags & UV_PROCESS_DETACHED) { process_flags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP;