c - 作为后台进程执行c程序

标签 c windows

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

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

详细信息是:

语言:c

编译器:dev cpp

平台:Windows 7/8

有什么方法可以在没有防病毒警报的情况下用 C 创建后台进程吗?

最佳答案

如果您只想让应用程序在后台运行而不显示控制台窗口,那么问题的解决方案就简单得多:只需不要创建控制台窗口即可!

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

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

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

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

这将自动设置 /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 .

关于c - 作为后台进程执行c程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25090696/

相关文章:

c - 如何在 C 中恢复原始信号处理属性

c - 如何删除空格并检查字符串是否是回文?

编译AVX2程序

c - 数组缓冲区和 winapi

c - 用指针打印

c++ - Linux 相当于 WaitCommEvent

windows - Bash 函数自动执行未按预期执行的 curl POST 身份验证

java - 从批处理脚本创建 jar 文件

c - 在 Windows 平台上,C 代码中的临时重定向 stderr 为 null。

从 Windows 到 Linux 的 C++ 交叉编译器