Запуск консольного приложения из командной строки без запуска нового окна консоли

Есть ли способ предотвратить запуск консольным приложением нового окна консоли, если оно выполняется из командной строки? Я не знаю, почему я никогда не замечал этого раньше (или если меня просто это раньше не раздражало), но я хотел бы иметь возможность открыть командную строку, перейти туда, где находится мое консольное приложение (.exe) есть и запустите его без запуска нового окна консоли.

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


person Ryan    schedule 06.06.2014    source источник


Ответы (1)


Консольное приложение при запуске из существующей командной строки не создаст новое консольное окно: Windows будет повторно использовать существующее окно.

Исполняемые файлы PE (т. е. .exe файлы) помечаются флагом, который сообщает ОС, является ли это консольным приложением или нет: если оно помечено как консольное приложение, Windows будет повторно использовать окно консоли, используемое для его запуска, или создаст новое окно, если оно было запущено из процесса с графическим интерфейсом (например, проводника Windows). В приложениях .NET этот флаг управляется раскрывающимся списком «Тип приложения» в свойствах проекта (где перечислены «приложение Windows», «консольное приложение» или «библиотека классов»).

Если ваша программа создает новое окно, то, вероятно, у нее установлен неправильный флаг ИЛИ программный код вручную вызывает AllocConsole, который создаст новое окно консоли независимо от того, как был создан процесс или флаг консоли PE.

Обновление Есть еще одна причина: когда консольное приложение запускается с уровнем привилегий, отличным от его родительского окна консоли (без повышенных прав), UAC потребует, чтобы оно находилось в отдельном окне.

person Dai    schedule 06.06.2014
comment
Может быть, поэтому я никогда не замечал этого раньше. Однако в моем случае странно то, что для этого типа вывода в свойствах приложения установлено значение «Консольное приложение», а AllocConsole не используется. Есть только две другие вещи, о которых я могу думать, которые могли бы повлиять здесь. 1) Решение содержит три проекта и установку Install Shield. Один проект — это общая библиотека классов, один — приложение WPF, а третий — консольное приложение. Они разворачиваются параллельно. 2) У консольного приложения есть app.manifest, чтобы оно не выдавало глупых ошибок при развертывании. - person Ryan; 06.06.2014
comment
@Ryan Я предлагаю сделать копию вашего решения, а затем удалить все, пока вы не получите минимальный код / ​​файлы, необходимые для воспроизведения проблемы, а затем опубликовать код здесь, в StackOverflow. - person Dai; 06.06.2014
comment
Прикинул. В моем app.manifest для requestedExecutionLevel установлено значение requireAdministrator, потому что приложению требуется доступ на административном уровне. Я изменил значение на asInvoker, и оно выполнилось на месте (как вы упомянули выше, Дай). UAC - это то, что заставляет его вести себя таким образом. Я не подписываю файл, потому что приложение действительно предназначено только для внутреннего использования. Во всяком случае, это, кажется, реальная проблема в моем случае! - person Ryan; 06.06.2014
comment
@ Райан Да, это еще одна причина. Я исправлю свой ответ сейчас. - person Dai; 06.06.2014
comment
@Ryan Если приложению требуется доступ администратора, вы можете решить свою проблему другим способом: запустить его из окна административной командной строки вместо обычного. (Подсказка: в Windows 7 нажмите клавишу Windows, введите cmd в меню «Пуск» и нажмите CONTROL-ALT-ENTER. В Windows 8 я думаю, что это ярлык Windows-X, а затем A.) - person Harry Johnston; 07.06.2014
comment
Спасибо! Проблема решена. В моем случае мне пришлось запустить command prompt от имени администратора. - person AlexMelw; 17.11.2017