C , как заставить консольное приложение работать в фоновом режиме после его закрытия?

#c #windows #visual-studio #process #background

#c #Windows #visual-studio #процесс #фон

Вопрос:

Есть ли какой-нибудь способ сделать это? Я имею в виду, закройте консольное приложение, но не процесс, приложение все еще работает в фоновом режиме. Я в Windows

Комментарии:

1. Есть ли причина, по которой это должно быть консольное приложение? Обычный способ создания фонового приложения — это вообще не иметь консоли.

2. При запуске вашего приложения ему потребуется создать неконсольный фоновый сервер, который выполняет всю работу, не связанную с пользовательским интерфейсом. Процесс пользовательского интерфейса консоли переднего плана не может избежать завершения при закрытии консоли. Слишком поздно вызывать FreeConsole . Как только приложение получает консоль CTRL_CLOSE_EVENT , у него есть 5 секунд, чтобы корректно завершить работу самостоятельно, после чего сервер сеансов Windows (csrss.exe ) принудительно прекращает его.

Ответ №1:

Существует несколько способов сделать это:

  1. Вы можете просто скрыть консоль, выполнив что-то вроде ShowWindow(GetConsoleWindow(), SW_HIDE); или FreeConsole(void);
  2. Используйте int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow); и установите для последнего параметра значение false (если вы используете Windows)

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

Комментарии:

1. Скрывайте окно консоли только в том случае, если GetWindowThreadProcessId считаете, что ваш процесс является фактическим владельцем окна. Для обычных консольных окон, conhost.exe является реальным владельцем окна, но система отслеживает эффективного владельца. Обычно это клиентский процесс, который выделил консольный сеанс. Обратите внимание, что при постоянном сеансе в Windows 10, например, в Windows Terminal, conhost.exe (или openconsole.exe ) владеет возвращаемым окном GetConsoleWindow , которое является просто скрытым окном, существующим для удовлетворения API.