使我的控制台应用程序不可见

22

我正在为我的公共图书馆开发一个控制台应用程序,这是我的学校项目。当用户登录时,控制台应用程序将自动运行并进行一些后台工作。

问题是,我不希望控制台应用程序实际上出现在屏幕上。我需要它是隐形的。最后一件我想要的事情是因为一些人吓到了CMD窗口的打开和关闭而抱怨,除此之外,图书馆希望它尽可能不可见。

我试图遵循此线程中的代码:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd,但是无济于事,我仍然能看到控制台应用程序在完成所有工作后弹出并关闭。

有没有更好的方法防止控制台出现呢?谢谢。


你试过我的代码了吗?你还在遇到问题吗? - Searock
这回答您的问题吗?显示/隐藏C#控制台应用程序的控制台窗口 - StayOnTarget
6个回答

40

最好的做法是将其编译为Windows可执行文件,而不是编译为控制台应用程序!这样不会显示控制台。然后,您可以在Main方法中做任何需要做的事情而无需显示UI。

但无论如何,如果您必须隐藏/显示控制台窗口,我建议不要使用FindWindow完成此任务,因为有一个更可靠的API: GetConsoleWindow。 这将给您控制台窗口的HWND句柄,您可以尝试将其传递给ShowWindow。


啊,我明白了。那在Visual Studio的“新建项目”下应该选什么?“空项目”?因为我没有看到普通的.exe选项,只有一些窗体和控制台应用程序。 - Kratz
3
你可以右键点击项目,选择属性,然后将输出类型从“控制台应用程序”更改为“Windows 应用程序”。不需要作任何其他更改。 - Josh
好的,我做到了,但是现在我的应用程序无法工作 :/ 当它是控制台应用程序时,它可以创建目录并发送 web 请求... 现在它什么也做不了。 - Kratz
我想不出什么原因会导致仅仅改变输出类型就引起这些问题。也许在尝试隐藏控制台窗口时,您同时更改了其他内容? - Josh

19

正如Josh Einstein所建议的那样,您可以使用ShowWindow API来隐藏您的窗口。

下面是一个示例:

using System.Runtime.InteropServices

class CommandLine
{

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("Kernel32")]
    private static extern IntPtr GetConsoleWindow();

    const int SW_HIDE=0;
    const int SW_SHOW=5;

    static void Main(string[] args)
    {
         IntPtr hwnd;
         hwnd=GetConsoleWindow();
         ShowWindow(hwnd,SW_HIDE);

         //Your logic goes here
    }
}

我对这段代码不确定,因为我没有测试过。如果你遇到任何问题,请让我知道。


1
这个可以工作,但是当你从另一个进程启动该进程时会显示一个短暂的控制台窗口。 - Wouter

9
您尝试过以下操作吗:项目属性 > 应用程序 > 输出类型:更改为“Windows应用程序”?

我刚刚这样做了,现在应用程序出问题了,它本来是要从嵌入式资源中创建目录并复制文件的,现在却无法工作。:( - Kratz

2
这段话的翻译如下:

这比控制台应用程序要复杂一些...但是,如果你想要在某人登录时真正地在后台运行某个东西,那么你可以创建一个Windows服务应用程序。

但是,设置和安装Windows服务需要额外的工作,但网络上有大量的示例代码:

http://msdn.microsoft.com/en-us/library/9k985bc9(v=VS.80).aspx

http://msdn.microsoft.com/en-us/library/sd8zc8ha(v=VS.80).aspx

http://www.c-sharpcorner.com/uploadfile/mahesh/window_service11262005045007am/window_service.aspx

http://www.developer.com/net/net/article.php/2173801/Creating-a-Windows-Service-in-NET.htm

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx


1
一个需要注意的问题是,服务将在用户登录之前启动,并且不与特定的用户帐户绑定。根据您正在做什么,这可能很有用,也可能会引起麻烦。 - Kelly Elton

2

你好,我正在创建一个控制台应用程序,该程序将由任务计划程序调用。我不想让控制台应用程序显示出来,因此我更改了项目属性,将输出设置为Windows应用程序。

将输出类型更改为Windows应用程序 进入:项目 -> 项目属性 然后将输出类型更改为Windows应用程序


要通过任务计划程序将其隐藏,您只需在创建任务时勾选“即使用户未登录也运行”即可。 - Heriberto Lugo

0

我尝试了两种方法:2)Searock和1)Josh --- 使用Searock的解决方案,控制台应用程序窗口仍然出现,虽然只是短暂的一瞬间 --- 然而,使用Josh的解决方案,控制台没有出现,我的程序也没有任何问题 - 当然,我确实不得不用一个调用将信息记录到日志文件中来替换所有的console.writeline调用

注意:我本来想在Josh的解决方案上发表评论,但我还不能这样做 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接