2015-06-27 4 views
1

При попытке выполнить cmd.exe с SW_HIDE параметра Я:Почему работает ShellExecute() ing cmd.exe?

ShellExecute(NULL, "open", "cmd.exe", NULL, NULL, SW_HIDE); 

cmd.exe фактически выполняется скрыто! Я не понимаю, почему это произошло, консольное окно cmd.exe считается «нормальным» окном, которое принимает параметр nCmdShow, или cmd.exe при его исполнении видит, что я прошел SW_HIDE для параметра nCmdShow и решает не показывать консольное окно?

Примечание: Я попробовал этот код на Windows 7.

+0

CREATE_NO_WINDOW это способ сделать это. Приложения в режиме консоли не получают возможности создавать окна. Система обрабатывает это. ShellExecute - для глаголов оболочки. Для создания процессов используйте CreateProcess. –

+0

@David Heffernan Итак, при выполнении cmd.exe с помощью 'CreateProcess()' с параметром 'CREATE_NO_WINDOW' система не будет создавать консольное окно для cmd.exe? – James

+0

Исправить. Это правильный способ сделать это. –

ответ

1

Подразумевается, что cmd.exe просто использует nCmdShow аргумент WinMain (или что он использует SW_SHOWDEFAULT что означает то же самое) при показе окна его через ShowWindow , не проверяя или не изменяя значение сначала.

Не задокументировано, что оно будет работать, и поэтому вы не должны полагаться на него, но это хороший побочный эффект, который может быть хорошим способом запуска пакетных скриптов без видимого окна.

Конечно, если вы на самом деле запустить интерактивную cmd.exe в скрытом окне это будет довольно трудно когда-либо сделать его видимым :)

+0

Таким образом, гарантированный способ выполнения cmd.exe без отображения окна консоли - с помощью 'CreateProcess()'? – James

+0

@James Я не думаю, что любой из этих методов «гарантирован», поскольку в корне это до cmd.exe, как он показывает свое окно. Тем не менее, это, вероятно, довольно безопасно, что это никогда не изменится. –

+0

Поэтому, когда 'CreateProcess()' используется с параметром 'CREATE_NO_WINDOW', это не заставляет приложение скрывать любые окна консоли, которые он может отображать, а скорее просто запрашивает приложение, чтобы сделать это, и приложение может игнорировать это запрос? – James

Смежные вопросы