Когда вы пишете программу WinMain, вы автоматически получаете параметр / SUBSYSTEM для окна в компиляторе. (Предполагая, что вы используете Visual Studio). Для любого другого компилятора может присутствовать аналогичная опция, но имя флага может быть другим.
Это заставляет компилятор создать запись в формате исполняемого файла ( PE формат ), которая помечает исполняемый файл как исполняемый файл Windows.
Как только эта информация присутствует в исполняемом файле, системный загрузчик, запускающий программу, будет обрабатывать ваш двоичный файл как исполняемый файл Windows, а не как консольную программу, и, следовательно, он не вызывает автоматического открытия окон консоли при запуске.
Но программе Windows не нужно создавать какие-либо окна, если она этого не хочет, так же, как все те программы и службы, которые вы видите запущенными на панели задач, но не видите соответствующих им окон. Это также может произойти, если вы создали окно, но решили не показывать его.
Все, что вам нужно сделать, чтобы достичь всего этого,
#include <Windows.h>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
/* do your stuff here. If you return from this function the program ends */
}
Причина, по которой вам требуется сам WinMain, заключается в том, что после того, как вы пометите подсистему как Windows, компоновщик предполагает, что ваша функция точки входа (которая вызывается после загрузки программы и инициализации библиотеки C Run TIme) будет WinMain, а не основной , Если вы не предоставите WinMain в такой программе, вы получите неразрешенную ошибку символа во время процесса связывания.