запустить программу без консольного окна (в фоновом режиме) - PullRequest
2 голосов
/ 14 июня 2011

Я хочу запустить простую программу при запуске Windows, но я не хочу показывать окно вывода консоли, связанное с этой программой. Просто для проверки программа может быть такой простой, как:

    int main (int argc, char** argv)
    {
        while (1)
        {
             printf ("hello world...\n");
             Sleep (10000);
        }
    return 0;
    }

компилирует это как: cl foo.c

Я знаю, как запустить программу при запуске Windows (положить в папку автозагрузки, создать реестр и т. Д.), Но я не знаю, как скрыть окно вывода консоли, которое появляется при запуске программы.

При поиске этого я обнаружил, что могу использовать start /B foo.exe. Есть ли другой способ сделать это? что-то вроде "&" мы используем в Unix.

Моя настоящая программа большая и написана на C, поэтому я не могу использовать некоторые другие альтернативы для c# (например, WinMain) и java (как объяснено здесь ).

Ответы [ 6 ]

5 голосов
/ 14 июня 2011

Это должно работать.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdParam, int iCmdShow)
{
    for (;;) {
        //action here
    }
    return 0;
}
3 голосов
/ 14 июня 2011

WinMain не является точкой входа C #.C # использует метод статического класса;по умолчанию он называется Main, но его можно настроить для любого метода статического класса.

В Windows не консольные программы на языке C должны определять WinMain.Затем вы можете связать их, используя параметр командной строки /subsystem:windows компоновщика, который вызывается либо напрямую, либо из CL.

1 голос
/ 12 июля 2013

К сожалению, просто установив FreeConsole () в качестве первой функции в main, окно все равно может появиться на мгновение. А FreeConsole удаляет окно, так что если вы хотите использовать его позже (как при уничтожении процесса), вы должны заставить его появиться на экране в режиме вне вашего контроля.

Windows позволяет программам Win32 иметь только один из четырех контекстов в Visual Studio: оконная программа с начальным окном GUI, консольная программа с начальным окном консоли, DLL или Lib. Изменение подсистемы на неконсольный выбор из проекта-> Свойства-> Системное представление приводит только к связыванию проблем, которые блокируют сборку.

Вот то, что сработало для меня с небольшим усилием. Используйте подход Майка выше и выберите Win32 Project с Windows Application. Затем удалите все в WinMain после направления «Поместите код здесь» и удалите все вызываемые функции. Верните true или 1, как вы хотите от WinMain. Ни одно окно любого типа не появится при запуске.

И когда вы готовы работать с консольным окном, вызовите AllocConsole () в своем коде и по своему усмотрению определите его расположение и размер. Консоль можно расположить вне экрана и, если хотите, вывести на экран; это займет всего несколько минут, чтобы получить представление о функциях настройки. Начните с «Консольных функций» Microsoft в документах MSDN. К сожалению, нет книги о том, как правильно использовать все функции, как в NCurses в Linux.

1 голос
/ 14 июня 2011

Один метод вызывает FreeConsole () как первое в главном. Оно скрывает окно консоли, если оно есть.

0 голосов
/ 14 июня 2011

WinMain не уникален для C #.Можно также писать приложения с графическим интерфейсом на C.Функция WinMain является точкой входа, но ничто не говорит о том, что вам действительно нужно создать окно.Вы можете сделать так, чтобы WinMain ничего не делал, кроме как вызывал первую функцию вашей программы, чтобы запустить ее.Тогда ваша программа будет запущена без окна графического интерфейса и без окна консоли.

Конечно, это также означает, что нет простого способа остановить его, если не убить его из диспетчера задач.

0 голосов
/ 14 июня 2011

Когда вы создаете свой проект, создайте его с помощью WinMain (Win32 Project).Если вам все еще нужна консоль, используйте AllocConsole () и FreeConsole ().

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