C# - 启动Invisible Process(CreateNoWindow和WindowStyle不工作?)

Cha*_*had 13 .net c# process processstartinfo winforms

我有两个程序(.exe),我在.NET中创建.我们称他们为师父和工人.大师启动1个或更多工人.工作人员不会与工作人员进行交互,但它是一个WinForms应用程序,它接收命令并根据从主服务器接收的命令运行WinForms组件.

我希望Worker应用程序完全隐藏运行(当然,除了显示在任务管理器中).我认为我可以使用StartInfo.CreateNoWindowStartInfo.WindowStyle属性完成此操作,但我仍然在表单中看到Client.exe窗口和组件.但是,它不会显示在任务栏中.

   Process process = new Process
      {
          EnableRaisingEvents = true,
          StartInfo =
              {
                  CreateNoWindow = true,
                  WindowStyle = ProcessWindowStyle.Hidden

                  FileName = "Client.exe",
                  UseShellExecute = false,
                  ErrorDialog = false,
              }
      };
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能让Client.exe运行但不显示?

Chr*_*ich 7

你使用CreateNoWindow/ WindowStyle在我的系统上使用notepad.exe工作正常(例如它隐藏但在后台运行),所以它可能是WinForms应用程序正在做的事情.一些想法:

选项1:如果您控制WinForms工作进程,则可以覆盖Control.SetVisibleCore以始终隐藏表单.如果您不想总是隐藏它,可以将命令行参数传递给它,例如/hide,这将导致它被隐藏.示例(假设表单已经存在代码隐藏):

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,运行会MyForm.exe产生具有可见形式的过程.MyForm.exe /hide在具有隐藏表单的进程中运行结果.您可以/hide从主进程传递参数,因此运行应用程序的普通用户仍然可以看到它.

选项2:您可以通过执行P/Invoke来启动应用程序ShowWindow.在此更多信息在这里.这样做的缺点是,在隐藏之前,您有时可以看到工作窗口闪烁.例:

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);
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*her 5

问题在于UseShellExecute = false,将此设置为,true并且该过程将以隐藏的方式启动.使用shell启动进程可以了解如何隐藏应用程序,直接UseShellExecute = false启动进程直接启动进程,正如Chris Schmich所提到的,您必须处理从客户端应用程序内部隐藏窗口.如果您希望手动运行应用程序以进行调试或测试,则可能更希望这样做.

  • 杰夫,谢谢你的评论.不幸的是,这对我也没有用.我认为它必须与我表单上的组件有关,但我不知道为什么会出现这个问题.你能解释一下"使用shell启动进程了解如何隐藏应用程序,直接用UseShellExecute = false启动进程直接启动进程"?谢谢. (2认同)