代码之家  ›  专栏  ›  技术社区  ›  Chad

启动不可见进程(createnowindow&windowstyle不工作?)

  •  13
  • Chad  · 技术社区  · 15 年前

    我有两个在.NET中创建的程序(.exe)。我们叫他们主人和工人。主启动1个或多个工人。工人意志 用户可以与之交互,但它是一个winforms应用程序,它根据从主服务器接收的命令接收命令并运行winforms组件。

    我希望Worker应用程序 完全隐藏运行 (当然,除了出现在任务管理器中)。我想我可以用 startinfo.createnow窗口 开始信息.windowstyle 属性,但我仍然可以在窗体中看到client.exe窗口和组件。但是,它不会显示在任务栏中。

       Process process = new Process
          {
              EnableRaisingEvents = true,
              StartInfo =
                  {
                      CreateNoWindow = true,
                      WindowStyle = ProcessWindowStyle.Hidden
    
                      FileName = "Client.exe",
                      UseShellExecute = false,
                      ErrorDialog = false,
                  }
          };
    

    要让client.exe运行但不显示,我需要做什么?

    3 回复  |  直到 11 年前
        1
  •  7
  •   Chris Schmich    15 年前

    你的用法 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);
        }
    }
    

    带着这个,跑步 MyForm.exe 以可见形式生成进程。运行 MyForm.exe /hide 导致进程具有隐藏的窗体。你可以通过 /隐藏 来自主进程的参数,因此运行应用程序的普通用户仍然可以看到它。

    选项2: 在应用程序启动后,可以通过对 ShowWindow . 有关此的详细信息 here . 这有一个缺点,即有时您可以看到工作窗口在被隐藏之前闪烁而存在。例子:

    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);
    }
    
        2
  •  5
  •   Jeff Schumacher    15 年前

    问题出在 UseShellExecute = false 将此设置为 true 过程将以隐藏方式启动。使用shell启动进程了解如何使应用程序隐藏,在何处直接启动进程 useShellExecute=false 直接启动这个过程,正如ChrisSchmich提到的,您必须处理从客户机应用程序内部隐藏窗口的问题。如果您希望选择手动运行应用程序以进行调试或测试,这可能更可取。

        3
  •  0
  •   zessx    11 年前

    你必须增加 base.Visibility = Visibility.Hidden; 在Win窗体应用程序构造函数中。

    推荐文章