执行c程序作为后台进程

时间:2014-08-02 01:12:18

标签: c windows

我正在尝试在C中创建后台进程以禁用输出/执行窗口的可见性。我使用了以下代码,但在使用此代码时,防病毒软件会将其作为威胁进行转发并生成警告:

   HWND stealth; 
   AllocConsole();
   stealth=FindWindowA("ConsoleWindowClass",NULL);
   ShowWindow(stealth,0);

详细信息:

语言:c

编译器:dev cpp

平台:windows 7/8

有没有办法在没有防病毒警报的情况下在C中创建后台进程?

1 个答案:

答案 0 :(得分:4)

如果您只想要一个在后台运行的应用程序而不显示控制台窗口,那么您的问题的解决方案更简单:只是不创建控制台窗口!< /强>

现在,说起来容易做起来难。您可能已在Visual Studio或其他IDE中使用该模板创建了一个控制台应用程序。这会导致应用程序在构建为控制台应用程序时被标记,并且此类应用程序始终在启动时分配了一个控制台窗口。

您不希望如此,因此您需要指明您的应用程序是控制台应用程序。实际上,它只是一个不显示任何窗口的常规Windows(Win32)应用程序。编写标准Windows应用程序时,默认情况下不会创建任何窗口。如果您不在代码中创建它们,则不会创建或显示任何内容。这正是你想要的后台进程。

如何使这种魔力发生取决于您的编译器/链接器/ IDE。假设您使用的是Visual Studio,则可以按照以下步骤操作:

  1. 在解决方案资源管理器中右键单击您的项目。
  2. 打开左侧树中的“链接器”类别。
  3. 选择树中的“系统”项。
  4. 将“子系统”设置更改为 Windows ,而不是控制台。
  5. 这会自动将/SUBSYSTEM linker flag设置为指定WINDOWS,而不是CONSOLE

    (编辑:我刚注意到你说你正在使用Dev CPP。我从未使用过那个IDE,但根据我在网上找到的指示,你可以在你的项目选项中将目标设置为“GUI” 。应该导致在调用链接器时设置-Wl,-subsystem,windows开关。如果没有,在项目选项中找到链接器标志并确保传递该开关。)

    您还需要采取最后一步来更改应用程序的入口点。控制台应用程序有一个名为main的入口点。 For Windows applications, it is named wWinMain并具有以下签名:

    int WINAPI wWinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        PWSTR pCmdLine,
                        int nCmdShow);
    

    您应该只需将main方法的签名更改为wWinMain的上述签名,即可参加比赛。


    如果你不想以正确的方式做到这一点,那么仍然有比你现在做的更好的选择。而不是发出可疑的命令来寻找,寻找一个进程,并隐藏它的窗口(只是一堆恶意软件,不是吗?),你可以简单地释放为你的应用程序自动创建的控制台窗口。为此,请拨打FreeConsole function

    它不需要任何参数,因为进程只能连接到一个控制台。你不需要告诉它什么是免费的,因为只有一种可能性。当控制台窗口与所有进程分离时,控制台窗口将自动关闭 - 如果您的应用程序是创建它的应用程序,并且是唯一一个附加到它的应用程序,这意味着它将自动关闭。

    如果由于某种原因需要再次使用控制台窗口,可以拨打AllocConsole