在没有控制台窗口的情况下启动程序(在后台)

时间:2011-06-14 11:42:44

标签: c windows background

我想在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(如解释{{3} }})。

7 个答案:

答案 0 :(得分:5)

这应该有用。

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdParam, int iCmdShow)
{
    for (;;) {
        //action here
    }
    return 0;
}

答案 1 :(得分:3)

WinMain不是C#入口点。 C#使用静态类的方法;它默认称为Main,但可以配置为任何静态类方法。

在Windows中,非控制台C程序应定义WinMain。然后,您可以使用链接器的/subsystem:windows命令行选项链接它们,可以直接调用或从CL调用。

答案 2 :(得分:1)

一种方法是将FreeConsole()称为main中的第一件事。如果有的话,它会隐藏控制台窗口。

答案 3 :(得分:1)

不幸的是,只需将FreeConsole()设置为main中的第一个函数,就可以暂时显示窗口。并且FreeConsole会删除窗口,这样如果您希望以后再使用它(就像杀死进程一样),您必须让它以一种无法控制的模式显示在屏幕上。

Windows允许Win32程序在Visual Studio下只有四个上下文之一:具有初始GUI窗口的Window程序,带有初始控制台窗口的控制台程序,DLL或Lib。从项目 - > Properties-&gt;系统视图将子系统更改为非控制台选项只会导致阻止构建的链接问题。

只需要一点点努力,这对我有用。使用Mike的方法,选择Win32 Project with Window Application。然后在“在此处放置代码”方向后删除WinMain中的所有内容并删除所有被调用的函数。如您所愿,从WinMain返回true或1。启动时不会出现任何类型的窗口。

当您准备好处理控制台窗口时,请在代码中调用AllocConsole()并根据需要处理其定位和大小。如果您愿意,可以将控制台放置在屏幕外并滑入视野;只需几分钟即可完成配置功能的处理。从MSDN文档中的Microsoft“控制台功能”开始。不幸的是,没有关于如何正确使用所有功能的书籍,就像Linux中的NCurses一样。

答案 4 :(得分:0)

当您创建项目时,请使用WinMain创建一个(Win32项目)。如果您仍希望控制台稍后使用AllocConsole()和FreeConsole()。

答案 5 :(得分:0)

如果程序是procexp.exe,则可以直接使用:

FALSE

答案 6 :(得分:-1)

WinMain对C#来说并不是唯一的。也可以用C编写GUI应用程序。 WinMain函数是入口点,但没有任何东西说您必须实际创建一个窗口。你可以让WinMain做的只是调用程序的第一个函数来启动它。然后,您的程序运行时没有GUI窗口,也没有控制台窗口。

当然,这也意味着没有简单的方法来阻止它,而不是从任务管理器中删除它。