有什么办法在后台运行进程?

有什么命令行或.NET方法在后台运行一个进程,隐藏它试图打开的任何窗口?

已经尝试过:

var process = new Process() { StartInfo = new ProcessStartInfo() { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, FileName = TheRealExecutableFileNameHere } } process.Start(); 

到目前为止没有成功

查看Matlab引擎 。

如果这种方法符合您的需求,那么CodeProject上甚至会有一篇有趣的文章 。

我查看了我的代码,它看起来几乎与你的代码相同:

 ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments) { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardOutput = true }; Process process = Process.Start(psi); 

唯一值得注意的区别(格式化和我们选择的PSI构造函数除外)是我使用UseShellExecute和RedirectStandardOutput,因为我需要读取ran过程的结果。

我发现上面的代码在XP和Vista上一直运行一个隐藏的过程。 但是,我也发现,您可能也遇到过相同的问题,隐藏的进程可能会启动另一个默认情况下未隐藏的进程。 换句话说,如果您启动隐藏的流程A和流程A,则启动流程B,您无法控制流程B的显示方式。 可能会显示您无法控制的Windows。

希望这会有帮助。 祝好运。

您是否尝试过使用带有/ B开关的Microsoft DOS 启动命令?

Microsoft DOS启动命令

例如,

 START /B cmd.exe 

没有我不知道纯粹的.Net方式来实现这一目标。

然后我考虑了内核作业对象 ,但在UI限制中没有找到类似的选项。

因此,下一个( 但未经validation的 )想法是创建一个比暂停的进程,然后创建一个Windows钩子 ,它将监视CallWndProc并过滤掉WM_SHOW消息。 (然后,当然,恢复进程,在一个单独的线程中等待直到它终止,删除钩子)

您可能想要在.Net Framework中尝试BackgroundWorker类 (如果您还没有)。 它用于在单独的线程上执行长时间运行的进程,以防止它们阻碍UI。 看看吧。

我意识到这已经得到了回答,但您可以使用对FindWindow和ShowWindow的非托管调用来强制隐藏窗口。

 [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); psi = new ProcessStartInfo(); // etc.. some_process = Process.Start(psi); System.Threading.Thread.Sleep(50); // need give the window a chance to be created IntPtr hWnd = FindWindow(null, "name of the window"); if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE 

相当kludgy。

这取决于您是否要最小化启动应用程序,但是如果需要,允许它与用户交互,或者如果您想要禁止与用户进行所有访问,而不管发生了什么。

如果是后者,则可以在不同的桌面上下文中为当前用户运行该进程。

例如,通过“登录”对话框和Vista UAC使用不同的桌面上下文 – 在一个桌面上下文中发生的任何事情都独立于其他桌面上下文。

可能是你的问题的大锤方法。

我注意到,如果CreateNoWindow = false在Filename指向Windows可执行文件时绝对没有任何内容,如果您有权访问winform应用程序的源代码,那么您可能能够提供一个控制默认可见性的命令行参数。表单,并在Winform App启动代码中执行以下操作:

 static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 form1 = new Form1(); form1.Load += new EventHandler((s,o) => { //check if the form should be shown based on command line arg if (args.Contains("dontShowWindow")) { //hide it form1.ShowInTaskbar = false; form1.Visible = form1.ShowInTaskbar = false; } } ); Application.Run(form1); } 

在调用代码时,您现在可以将“dontShowWindow”指定为进程参数:

  ProcessStartInfo info = new ProcessStartInfo { CreateNoWindow = false, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, FileName = @"C:\temp\testWinForm.exe", Arguments = "dontShowWindow" }; Process.Start(info); 

希望这可以帮助

实现此目的的一种非常简单的方法是创建服务帐户并通过Windows任务计划程序在服务帐户用户的上下文中运行可执行文件。

您可以使用此CodeProject来设置计划任务:

http://www.codeproject.com/KB/cs/tsnewlib.aspx

您可以使用C#在域或本地计算机上以编程方式创建服务帐户。

http://www.codeproject.com/KB/system/OSUserMangement.aspx http://support.microsoft.com/kb/306273

除非该用户已登录,否则在另一个用户的上下文中作为计划任务运行的进程不会以交互方式显示; 因此使用服务帐户。

 public Form1() { InitializeComponent(); Form1 fm = new Form1(); fm.ShowInTaskbar = false; fm.Visible = fm.ShowInTaskbar = false; } 

效果很好!

我假设你想要一个在运行时对用户不可见的进程。

您可以尝试以下操作来查看这是否是您想要的。

  1. 创建一个持续运行的简单控制台应用程序(并启动它进行测试)。
  2. 右键单击项目 – >属性 – >应用程序选项卡 – >输出类型 – >将其从“控制台应用程序”更改为Windows应用程序。
  3. 再次启动相同的应用程序(看看这是否是你想要的)。
  4. 通过Windows任务管理器关闭应用程序:)

似乎该过程出现在任务管理器中,但在任务栏中不可见。 Alt + TAB无法启动此过程。

我只希望你没有制作任何恶意应用程序,但:)

我想您可能想要尝试创建一个新的Windows Station。 查看这篇文章,在msdn上解释一下它们。

http://msdn.microsoft.com/en-us/library/ms681928(VS.85).aspx

你可以制作一个Windows服务。 服务尝试打开的任何窗口都在会话0中运行,这意味着没有用户可以看到它。 这适用于所有窗户,所以也许这不是你想要的。

下面的代码对我有用:早期的过程(记事本)用于在桌面屏幕上闪存记事本以进行打印,但它会分散用户的注意力,因此下面的代码会在后台隐藏记事本进程。

  System.Windows.Forms.PrintDialog printDialog = new PrintDialog(); System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt"); psi.Verb = "PRINT"; //Process.Start(psi); //psi.CreateNoWindow = true; psi.UseShellExecute = false; //--------------------------------------------------- psi.CreateNoWindow = false; psi.UseShellExecute = true; psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt"; psi.WindowStyle = ProcessWindowStyle.Hidden; psi.Arguments = @"%windir%\system32\notepad.exe"; //Process.Start(psi); //------------------------------------------------------ /////////////////////---------------------------------- printProcess.StartInfo = psi; /////psi.CreateNoWindow = true; //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt"; //p.StartInfo.FileName = "Notepad.EXE"; //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\""; printProcess.Start(); /////////////////////////------------------------------- while (!printProcess.HasExited) ; if (!printProcess.HasExited) { printProcess.Close(); }