我正在尝试用 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,您可以按照以下步骤操作:
- 在解决方案资源管理器中右键单击您的项目。
- 打开左侧树中的“链接器”类别。
- 在树中选择“系统”项。
- 将“子系统”设置更改为 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/