Cha*_*had 13 .net c# process processstartinfo winforms
我有两个程序(.exe),我在.NET中创建.我们称他们为师父和工人.大师启动1个或更多工人.工作人员不会与工作人员进行交互,但它是一个WinForms应用程序,它接收命令并根据从主服务器接收的命令运行WinForms组件.
我希望Worker应用程序完全隐藏运行(当然,除了显示在任务管理器中).我认为我可以使用StartInfo.CreateNoWindow和StartInfo.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运行但不显示?
你使用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)
问题在于UseShellExecute = false,将此设置为,true并且该过程将以隐藏的方式启动.使用shell启动进程可以了解如何隐藏应用程序,直接UseShellExecute = false启动进程直接启动进程,正如Chris Schmich所提到的,您必须处理从客户端应用程序内部隐藏窗口.如果您希望手动运行应用程序以进行调试或测试,则可能更希望这样做.