




В окнах:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// <-- Program logic here
return 0;
}
Обязательно используйте переключатель компоновщика / SUBSYSTEM, как упомянул Адам Митц.
На других платформах:
int main(int argc, char**argv)
{
// <-- Program logic here
return 0;
}
Две жалобы: WinMain не нужен, если вы не включаете windows.h; и вернем 0; в main не является обязательным.
Вы хотите вернуть 0, чтобы обозначить успех вызывающим его программам.
Если вы создаете консольное приложение и вместо этого используете int main для Windows, у вас будет всплывающее окно консоли при двойном щелчке по exe.
Я думаю, что на самом деле переключатель компоновщика / SUBSYSTEM определяет, есть ли окно консоли.
Спасибо, Адам. Я думаю, что именно этот переключатель определяет, использовать ли main или WinMain. Я добавил это к своему ответу.
Хорошо, другие ответы тоже упоминают об этом, так что это хорошо освещено. Я уверен, что большинство пользователей знакомы только с созданием «проекта консоли Win32» в Visual Studio.
@Brian - main () по умолчанию возвращает 0, если возвращаемое значение не указано. Это сумасшедший частный случай, который применим только к main ().
Когда вы пишете программу 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, а не main. Если вы не предоставите WinMain в такой программе, вы получите неразрешенную символьную ошибку во время процесса связывания.
У меня аналогичное требование, когда я использую таймер. я хочу, чтобы программа работала без остановки. В этой программе установлен таймер. так как мне это сделать. ?
Разве это не должно быть int WINAPI WinMain (...)?
Фактическое задание в Visual Studio 2017, например: 1) откройте визуальную студию 2) Файл-> Создать-> Проект 3) Visual C++ -> Общие 4) Выберите «Пустой проект» 5) Вырежьте и вставьте фрагмент выше. Добавить сон (60000); так что программа будет ждать вас. Скомпилируйте программу для создания program.exe. Дважды щелкните program.exe, и программа останется активной в течение 60 секунд. Проверьте Диспетчер задач и найдите там program.exe.
Если вы используете MSVC или Visual Studio, просто используйте новый Мастер проекта и выберите Консольное приложение.
консольное приложение всегда будет открывать консольное окно при запуске
Вы уверены, что понимаете, о чем говорите? en.wikipedia.org/wiki/Win32_console Думаю, что нет !!! В прошлый раз, когда я смотрел, консольное приложение было приложением win32 без графического интерфейса !!!
jussij - Верно. это приложение CLUI. и для взаимодействия с этим CLUI Windows создает для вас графический интерфейс CL.
@jussji - Вы правы - в консольной программе нет «окон», но попробуйте дважды щелкнуть консольную программу в проводнике, и ОС автоматически создаст окно консоли для запуска консольной программы. Похоже, Операции не нужны были ни настоящее окно, ни консоль. Отсюда мой комментарий.
Создание окна можно запретить!
WinMain - это ответ. Создайте пустой проект в Visual Studio 2017.
Если вам нужно непрерывно запускать вашу программу без консоли или окна, вы можете найти полезные deamon на * NIX или сервисы в Windows, этот пример .NET, если вам нужен простой win32, просто немного погуглите для примера. Поскольку ваш вопрос отмечен как win32, я предполагаю, что услуги более актуальны для вас.
Используйте мастер Visual Studio для создания приложения Win32. Но не создавайте окно, т.е. вы удаляете функцию создания окна. В качестве альтернативы мы можем создать приложение Win Service.
В Visual Studio Express 2010 после установки подсистемы в окна (как было предложено пользователем 17224), в качестве альтернативы изменению основного значения на WinMain (как было предложено пользователем 17224 и Брайаном Р. Бонди), можно установить функцию входа в значение main в свойствах, компоновщике, расширенный, точка входа: просто введите main в текстовое поле.
Я пробовал 'main' в Visual Studio 2017 и со всеми комбинациями параметров лайка / SUBSYSTEM, но безрезультатно. Однако я считаю, что здесь ответом будет точка входа WinMain, а не main.
Это также обрабатывает сообщения:
#include <windows.h>
#include <stdio.h>
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
MSG msg;
DWORD curThreadId;
curThreadId = GetCurrentThreadId();
// Send messages to self:
PostThreadMessage(curThreadId, WM_USER, 1, 2);
PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
PostThreadMessage(curThreadId, WM_QUIT, 9, 10);
while (GetMessage(&msg, NULL, 0, 0)) {
printf("message: %d; wParam: %d; lParam: %d\n", msg.message, msg.wParam, msg.lParam);
}
return (int) msg.wParam;
}
Связанная тема: stackoverflow.com/questions/13051412/…