C#控制台应用自动隐藏后台进程运行

简介

本文主要讲述C#控制台应用如何自动隐藏以后台进程运行。

方法一:通过ShowWindow方法隐藏控制台窗体;

方法二:将控制台应用转为Windows应用程序后台运行(推荐);

方法一:通过ShowWindow方法隐藏控制台窗体

1、在Visual Studio中创建C#控制台应用ConsoleApp3;

2、Program.cs添加引用;

using System.Diagnostics;

3、在Main方法上方添加dll引用ShowWindow方法

[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
private static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

4、Main方法中,添加隐藏当前进程窗体代码;

Process process = Process.GetCurrentProcess();
// 隐藏控制台窗体
ShowWindow(process.MainWindowHandle, 0); 

启动控制台应用,窗体即会自动隐藏后台运行。

Program.cs完整代码如下:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApp3
{
    class Program
    {

        [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
        private static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

        static void Main(string[] args)
        {
            Process process = Process.GetCurrentProcess();
            // 隐藏控制台窗体
            ShowWindow(process.MainWindowHandle, 0); 

            Console.WriteLine("Press Any key to exit...");
            Console.ReadKey();
        }
    }
}

方法二:将控制台应用转为Windows应用程序后台运行(推荐)

1、在Visual Studio中选中项目--右键属性--应用程序--输出类型,将“控制台应用程序”修改为“Windows应用程序”。

2、调用_waitHandle.WaitOne()保持程序后台运行不自动退出。

对于控制台应用程序,想要保持程序不退出,可以使用Console.ReadKey()或Console.ReadLine()。

对于Windows应用程序,最简单可以使用while(true)保持程序不自动退出,但此方式比较消耗CPU。对于C#,我们可以使用专门控制信号的两个类AutoResetEvent和ManualResetEvent来使进程进入等待。

// 进入等待状态使应用不自动退出
EventWaitHandle _waitHandle = new AutoResetEvent(false);
while(true)
{
    _waitHandle.WaitOne();
}

(1)循环中_waitHandle一直在等待,且不会占用CPU;
(2)事件发生时调用_waitHandle.Set(),就会执行WaitOne一次,执行完后再等待下一次Set被调用。

如果只需要程序保持后台运行,则直接调用_waitHandle.WaitOne()即可。

Program.cs完整代码如下:

using System.Threading;

namespace ConsoleApp3
{
    class Program
    {

        static void Main(string[] args)
        {

            //TODO 业务逻辑

            // 进入等待状态使应用不自动退出
            EventWaitHandle _waitHandle = new AutoResetEvent(false);
            while(true)
            {
                _waitHandle.WaitOne();
            }

        }

    }

}

(完)

C#
最后修改于:2023年04月15日 02:31

添加新评论