我想在Windows启动时启动一个简单的程序,但我不想显示与该程序相关的控制台输出窗口。 只是为了testing,该程序可以像这样简单:
int main (int argc, char** argv) { while (1) { printf ("hello world...\n"); Sleep (10000); } return 0; }
编译为: cl foo.c
我知道如何在Windows启动时启动程序(启动文件夹,创buildregistry等),但我不知道如何隐藏程序启动时出现的控制台输出窗口。
在search这个时候,我发现我可以使用start /B foo.exe
。 还有其他的方法吗? 有些东西像我们在unix上使用的"&"
。
我的实际程序很大,是用C
编写的,所以我不能使用一些其他的替代方法(例如WinMain)和java
(如这里所解释的)。
WinMain不是C#的入口点。 C#使用一个静态类的方法; 它在默认情况下被称为Main,但可以配置为任何静态类方法。
在Windows中,非控制台C程序应该定义一个WinMain。 然后,您可以使用链接器的/subsystem:windows
链接它们/subsystem:windows
命令行选项,可以直接或从CL中调用。
这应该工作。
#include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow) { for (;;) { //action here } return 0; }
一种方法是调用FreeConsole()作为主要的第一件事情。 它将隐藏控制台窗口,如果有的话。
不幸的是,简单的设置FreeConsole()作为main函数中的第一个函数可以使窗口暂时出现。 而且FreeConsole会删除这个窗口,所以如果你想稍后使用它(就像在杀死这个进程中一样),你必须使它出现在你的控制之外的模式下。
Windows允许Win32程序在Visual Studio下只有四个上下文中的一个:具有初始GUI窗口的窗口程序,具有初始控制台窗口的控制台程序,DLL或Lib。 从项目 – >属性 – >系统视图中将子系统更改为非控制台选项只会导致阻止构建的链接问题。
这只是一点点努力,对我来说是有效的。 使用上面的Mike的方法,选择带有Window应用程序的Win32项目。 然后在“在此处放置代码”方向后删除WinMain中的所有内容,并删除所有调用的函数。 如你所愿,从WinMain返回true或1。 发射时不会出现任何类型的窗口。
当你准备好处理一个控制台窗口的时候,在你的代码中调用AllocConsole(),并且按你认为合适的方式处理它的位置和大小。 控制台可以放在屏幕外面,如果你愿意的话可以滑入视野。 只需要几分钟就可以掌握配置功能。 从MSDN文档中的Microsoft“控制台功能”开始。 不幸的是,没有关于如何正确使用所有功能的书,就像Linux中的NCurses一样。
在创建项目时用WinMain创建一个(Win32项目)。 如果您仍然希望控制台稍后使用AllocConsole()和FreeConsole()。
WinMain
并不是C#独有的。 也可以用C编写GUI应用程序。 WinMain函数是入口点,但没有说你必须实际创建一个窗口。 WinMain只需调用程序的第一个函数就可以开始。 那么你会让你的程序在没有GUI窗口和没有控制台窗口的情况下运行。
当然,这也意味着没有简单的方法来阻止它,而不是从任务管理器中杀死它。