Создать приложение без окна

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

28
1

  • Связанная ветка: http://stackoverflow.com/questions/13051412/how-to-hide-the-console-window-in-a-win32-project-using-vis ...
5
Общее количество ответов: 5

Ответ #1

Ответ на вопрос: Создать приложение без окна

Когда вы пишете программу WinMain, вы автоматически 9X_c++ получаете параметр / SUBSYSTEM как окна 9X_cpp в компиляторе. (Предполагая, что вы используете 9X_c++ Visual Studio). Для любого другого компилятора 9X_windows-api может присутствовать аналогичная опция, но 9X_winapi имя флага может быть другим.

Это заставляет 9X_win32 компилятор создать запись в формате исполняемого 9X_cpp файла (PE format), которая помечает исполняемый файл 9X_window-api как исполняемый файл Windows.

Когда эта информация 9X_window-api присутствует в исполняемом файле, системный 9X_win32api загрузчик, запускающий программу, будет 9X_win32 рассматривать ваш двоичный файл как исполняемый 9X_c++ файл Windows, а не консольную программу, и, следовательно, он 9X_window-api не вызывает автоматическое открытие окон 9X_windows-api консоли при запуске.

Но программе Windows 9X_windows-sdk не нужно создавать какие-либо окна, если 9X_winapi она не хочет этого, как и все те программы 9X_win32 и службы, которые вы видите работающими 9X_windows-api на панели задач, но не видите для них соответствующих 9X_cxx окон. Это также может произойти, если вы 9X_winapi создаете окно, но не показываете его.

Все, что 9X_windows-sdk вам нужно сделать, чтобы добиться всего 9X_c++ этого, - это

#include 

int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance, 
            LPTSTR    lpCmdLine, 
            int       cmdShow)
    {
    /* do your stuff here. If you return from this function the program ends */
    }

Причина, по которой вам требуется 9X_win32 сам WinMain, заключается в том, что после 9X_c того, как вы пометите подсистему как Windows, компоновщик 9X_c предполагает, что ваша функция точки входа 9X_c (которая вызывается после загрузки программы 9X_c и инициализации библиотеки C Run TIme) будет 9X_win32 WinMain, а не основной . Если вы не предоставите 9X_c++ WinMain в такой программе, вы получите неразрешенную 9X_window-api ошибку символа в процессе связывания.

42
1

  • Разве это не должно быть int WINAPI WinMain ( ...

Ответ #2

Ответ на вопрос: Создать приложение без окна

В windows:

#include 

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   

Обязательно используйте переключатель компоновщика 9X_cxx / SUBSYSTEM, как упомянул Адам Митц.

На других платформах:

int main(int argc, char**argv)
{
  // <-- Program logic here
  return 0;
}

16
2

  • @Brian - main() по умолчанию возвращает ...

Ответ #3

Ответ на вопрос: Создать приложение без окна

Если вам нужно непрерывно запускать вашу 9X_windows-sdk программу без консоли или окна, вы можете 9X_winapi найти полезные deamon on *NIX или services on Windows, этот пример .NET, если 9X_winapi вам нужен простой win32, просто немного 9X_c++ погуглите для примера.
Поскольку ваш вопрос 9X_win32 отмечен как win32, я предполагаю, что услуги 9X_winapi более актуальны для вас.

4
0

Ответ #4

Ответ на вопрос: Создать приложение без окна

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

#include 
#include 

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;
} 

9X_winapi

2
0

Ответ #5

Ответ на вопрос: Создать приложение без окна

В Visual Studio Express 2010 после установки 9X_cxx подсистемы в Windows (как было предложено 9X_cxx пользователем 17224), в качестве альтернативы 9X_win32api изменению основного значения на WinMain 9X_windows-sdk (как было предложено пользователем 17224 9X_win32 и Брайаном Р. Бонди), можно установить функцию 9X_win32api входа в значение main в свойствах , компоновщик, расширенный, точка 9X_winapi входа: просто введите main в текстовое поле.

1
0