Создать приложение без окна - PullRequest
24 голосов
/ 22 октября 2008

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

Ответы [ 7 ]

39 голосов
/ 22 октября 2008

Когда вы пишете программу 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 в такой программе, вы получите неразрешенную ошибку символа во время процесса связывания.

14 голосов
/ 22 октября 2008

В окнах:

#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;
}
4 голосов
/ 22 октября 2008

Если вам нужно непрерывно запустить вашу программу без консоли или окна, вы можете найти полезные deamon для * NIX или служб для Windows , этот пример .NET, если вам нужно обычный win32 просто погуглите немного для примера.
Так как ваш вопрос помечен как win32, я предполагаю, что услуги более актуальны для вас.

1 голос
/ 20 января 2013

В Visual Studio Express 2010 после установки подсистемы на окна (как предложено пользователем 17224), вместо изменения основной на WinMain (как предложено пользователем 17224 и Брайаном Р. Бонди), в свойствах функции входа можно установить значение main в свойствах , linker, advanced, точка входа: просто введите main в текстовое поле.

0 голосов
/ 22 февраля 2019

Это также обрабатывает сообщения:

#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;
} 
0 голосов
/ 22 октября 2008

Используйте мастер Visual Studio для создания приложения Win32. Но не создавайте окно, т.е. вы удаляете функцию создания окна. В качестве альтернативы мы можем создать приложение Win Service.

0 голосов
/ 22 октября 2008

Если вы используете MSVC или Visual Studio , просто используйте новый Project Wizard и выберите Консольное приложение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...