在C#控制台应用程序中隐藏控制台窗口

122

问题在于,我真的不希望控制台窗口出现,但解决方案应该是运行的。 我的意思是,我想让应用程序在后台运行,而不会出现任何窗口。

我该怎么做?


2
你能否提供更多关于应用程序的信息?它听起来像是一个服务或Windows应用程序?如果我们了解它的目的,我们将能够提供更多帮助并建议解决问题的最佳方法。 - Dave
1
这是一个键盘记录应用程序。我使用了Windows服务,但它无法在Windows服务中获取按键状态。 - SOF User
这个回答是否解决了您的问题?显示/隐藏C#控制台应用程序的控制台窗口 - StayOnTarget
7个回答

216
将输出类型从“控制台应用程序”更改为“Windows应用程序”。这可以在Visual Studio中的“项目->属性->应用程序”下完成:

alt text


5
控制台窗口闪烁并消失了。 我该如何让应用程序在没有任何窗口的情况下继续运行? - SOF User
19
移除Console.ReadLine。如果没有控制台窗口,它是毫无意义的。 - Dirk Vollmar
@DirkVollmar 谢谢您的回答,它对我很有帮助 :) 一个问题 - 如何关闭这样的应用程序? - karollo
1
@KarolŻurowski:这里的想法是,您可以将其用于还配有某种形式的UI(例如系统托盘中的图标)或执行某个任务然后在完成后自动退出的应用程序。如果两者都没有,则该应用程序将在后台运行,直到注销/关闭计算机或明确终止它,例如使用任务管理器。 - Dirk Vollmar
@DirkVollmar 实际上我试过了,但是我认为它只能在Windows服务器上运行,而我需要我的服务也能在Win 8/10上运行。但事实证明它可以部署在Win 8/10上,所以我一定会仔细研究的,谢谢 :) - karollo
显示剩余4条评论

27
将您的应用程序类型更改为Windows应用程序。 您的代码仍将运行,但它将没有控制台窗口或标准窗口,除非您创建一个。

3
控制台窗口闪烁并消失。 我该如何让应用程序在没有任何窗口的情况下保持运行? - SOF User
你要确保它不会终止。没有更多的信息,真的没有什么其他要说的了。这个程序做什么?它是在循环中运行某些东西吗? - Lasse V. Karlsen

14

你可以使用 new ManualResetEvent(false).WaitOne() 代替 Console.Readline/key,这在我的实践中非常有效。


5

你可以使用 user32.dll 来实现这一点,而无需使用 vscode。

    class start
    {
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        static void Main()
        {
            IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
            ShowWindow(h, 0);
            // Do the rest

这仍然会闪屏,但足够有效。 using的使用方式是:
using System.Runtime.InteropServices;
using System.Diagnostics;

请注意,我仍然是C#新手,不是完美的,所以欢迎评论和修正!


3
虽然另一个解决方案更受欢迎,但我认为这个解决方案被低估了!特别是因为我可以根据逻辑条件来显示/隐藏控制台窗口,例如通过添加编译器指令,如“#if DEBUG”。 - Siavash Mortazavi
顺便提一下,“Process.GetCurrentProcess().MainWindowHandle;” 对我没用,而来自 https://dev59.com/FpLea4cB1Zd3GeqP1V82#34440934 的解决方案引入了另一个可以完成任务的 Windows API 调用。(在 Windows 10 上使用 .NET 6) - Siavash Mortazavi

3
将输出类型从“控制台应用程序”更改为“Windows 应用程序”,而不是使用“Console.ReadLine()/key”,您可以在末尾使用“new ManualResetEvent(false).WaitOne()”来保持应用程序运行。

3

3
Windows服务无法获取按键事件。 - SOF User
1
根据您的应用程序,服务的功能受到严格限制。自Windows Vista以来,它们被强制进入Session 0,因此无法在其他会话中执行任何操作,例如显示弹出消息。 - Matt
1
@Matt的“不能在其他会话中执行任何操作”不完全正确。这里有一个代码项目,专门为服务打造,在登录用户的桌面上打开管理员命令提示符。https://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite - Qodex

0
编译您的应用程序时,无需控制台窗口。
csc.exe /target:winexe *.cs

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