【问题标题】:Making my console application invisible使我的控制台应用程序不可见
【发布时间】:2024-01-22 19:05:01
【问题描述】:

我正在为我的公共图书馆开发一个控制台应用程序作为学校项目。一旦用户登录并执行一些后台工作,控制台应用程序就会运行。

问题是,我不希望控制台应用程序实际出现。我需要它隐形。我需要的最后一件事是抱怨,因为有些人害怕打开和关闭 CMD 窗口,此外图书馆希望它尽可能不可见。

我尝试按照此线程中的代码进行操作: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd

但无济于事,我仍然可以看到控制台应用程序在完成所有工作后弹出和关闭。

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

【问题讨论】:

  • 你试过我的代码了吗?您还面临问题吗?

标签: c# console-application invisible


【解决方案1】:

我尝试了两种方法 2) Searock 和 1) Josh --- 使用 Searock 的解决方案,控制台应用程序窗口仍然出现,尽管有很短的时间 --- 但是使用 Josh 的解决方案,控制台没有出现,我的程序也没有出现有任何问题——当然,我必须将所有 console.writeline 调用替换为将信息记录到日志文件的调用

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

【讨论】:

    【解决方案2】:

    您好,我正在创建一个由任务调度程序调用的控制台应用程序。我不希望显示控制台应用程序,因此我更改了项目属性以将输出输出到 Windows 应用程序。

    将输出类型更改为 Windows 应用程序 转到:项目 - >项目属性 并将输出类型更改为 Windows 应用程序

    【讨论】:

    • 要通过任务调度器将其隐藏,您只需在创建任务时勾选“即使用户未登录也运行”。
    【解决方案3】:

    正如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
        }
    }
    

    我不确定这段代码,因为我没有测试过。如果您遇到任何问题,请告诉我。

    【讨论】:

    • 这可行,但当您从另一个进程启动该进程时会显示控制台窗口的短暂闪烁。
    【解决方案4】:

    它比控制台应用程序复杂一点...但是如果您希望在有人登录时真正在后台运行某些东西,那么您可以创建一个 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

    【讨论】:

    • 一个提示是服务将在用户登录之前启动,并且不绑定到特定的用户帐户。这取决于你在做什么,这可能很有用,也可能会让人头疼。
    【解决方案5】:

    您是否尝试过:项目属性> 应用程序> 输出类型:到“Windows 应用程序”?

    【讨论】:

    • 我刚刚这样做了,现在应用程序坏了,它是为了从嵌入式资源创建目录和复制文件,现在它不起作用。 :(
    【解决方案6】:

    最好的办法就是不要将它编译为控制台应用程序!将其编译为 Windows EXE,不会显示任何控制台。然后,您可以在 Main 方法中执行您需要执行的任何操作,而无需显示 UI。

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

    【讨论】:

    • 这也是我的建议。 +1。
    • 啊,我明白了。那么在 Visual Studio 的“新项目”下会是什么? “空项目”?因为我没有看到普通 .exe 的选项,只有一些表单和控制台应用程序。
    • 您只需右键单击项目,选择属性,然后将输出类型从控制台应用程序更改为 Windows 应用程序。无需进行其他更改。
    • 好的,我做到了,但现在我的应用程序将无法工作:/ 当它是一个控制台应用程序时,它用于创建目录和发送 Web 请求......现在它不会做任何事情那个。
    • 我想不出任何理由仅仅改变输出类型会导致任何这种情况。也许您在尝试隐藏控制台窗口时更改了其他内容?
    最近更新 更多