C# - Launch Invisible Process (CreateNoWindow & WindowStyle not working?)

前端 未结 4 890
遇见更好的自我
遇见更好的自我 2020-12-30 05:34

I have 2 programs (.exe) which I\'ve created in .NET. We\'ll call them the Master and the Worker. The Master starts 1 or more Workers. The Worker will not

4条回答
  •  死守一世寂寞
    2020-12-30 05:38

    Your usage of CreateNoWindow/WindowStyle works fine on my system with notepad.exe (e.g. it is hidden but running in the background), so it's probably something the WinForms app is doing. Some ideas:

    Option 1: If you control the WinForms worker process, you can override Control.SetVisibleCore to always hide the form. If you don't want to always hide it, you can pass a command-line argument to it, e.g. /hide that will cause it to be hidden. Example (assuming there's already code-behind for the form):

    public partial class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
        }
    
        protected override void SetVisibleCore(bool value)
        {
            // You'd probably want to parse the command line.
            if (Environment.CommandLine.Contains("/hide"))
                base.SetVisibleCore(false);
            else
                base.SetVisibleCore(value);
        }
    }
    

    With this, running MyForm.exe results in a process with a visible form. Running MyForm.exe /hide results in a process with a hidden form. You could pass the /hide argument from your master process, so then normal users running the application will still see it.

    Option 2: You can hide the application after it starts by doing a P/Invoke to ShowWindow. More info on this here. This has the drawback that you can sometimes see the worker window flicker into existence before being hidden. Example:

    class Program
    {
        public static void Main(string[] args)
        {
            ProcessStartInfo psi = new ProcessStartInfo()
            {
                FileName = @"C:\windows\system32\notepad.exe",
            };
    
            Process process = Process.Start(psi);
    
            // Wait until the process has a main window handle.
            while (process.MainWindowHandle == IntPtr.Zero)
            {
                process.Refresh();
            }
    
            ShowWindow(process.MainWindowHandle, SW_HIDE);
        }
    
        const int SW_HIDE = 0;
    
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    }
    

提交回复
热议问题