C# 我无法让 CreateNoWindow 工作——甚至 msdn.com 示例也不行
C# I can't get CreateNoWindow to work - not even the msdn.com example
我看过这里
我明白
A) 并非每个程序都尊重它的 CreateNoWindow 请求并且
B) 它需要 UseShellExecute=False(默认为 true)。
C) 表示是否创建了window。 (它永远不会隐藏父 window)。说的是是否为子进程创建了一个window。 (msdn 说 'new window')
D) CreateNoWindow 默认为 false。
我是从 cmd 运行 宁此的,尽管在 visual studio 中单击播放说明了相同的行为。
我将 CreateNoWindow 设置为 false,所以我认为它会为子进程创建一个新的 window。
但事实并非如此。
任务管理器显示了 cmd.exe 的第二个实例,但如您所见,仍然有一个 window。下面是一个 window 的粘贴。它已将子 cmd.exe 加载到父 window 中(一个命令 window)
如果我将 CreateNoWindow 设置为 true 或 false,那么它似乎没有什么区别。
所以我显然没有让 msdn link 上的示例正常工作。
C:\crp>type aaa.csc
using System.Diagnostics;
class blah{
public static void Main(string[] args) {
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute=false;
psi.FileName="cmd.exe";
psi.CreateNoWindow=false;
p.StartInfo=psi;
p.Start();
}
}
C:\crp>csc aaa.csc
Microsoft (R) Visual C# Compiler version 4.0.30319.34209
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
C:\crp>aaa.exe
C:\crp>Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\crp>
更新
看来确实有效。如果您打开 cmd 提示符和 运行 exe,那么在一种情况下它会在父级中启动 cmd.exe。在另一种情况下,它开始 cmd.exe 而没有任何 window。 visual studio 中的行为看起来很奇怪,请参阅我对以法莲答案的评论。在这个问题中,在 visual studio 内,我只尝试将项目设置为控制台应用程序,并且 cmd 提示 window 总是至少会弹出。对于非控制台应用程序,行为要简单得多,例如一个 winforms 应用程序。
尝试使用 Visual Studio 并为 cmd.exe
定义拉取文件路径
public static void Main(string[] args) {
try
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "C:\Windows\System32\cmd.exe"; // full path
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process childProcess = Process.Start(psi); // child process
// This code assumes the process you are starting will terminate itself.
// Given that is is started without a window so you cannot terminate it
// on the desktop, it must terminate itself or you can do it programmatically
// from this application using the Kill method.
}
catch(Exception ex)
{
Console.WriteLine(e.Message);
}
}
我设置了 UseShellExecute=True;
....它似乎有效。
奇怪,没有那一行,你必须输入 exit 两次,一次到 'close' child cmd.exe (这并没有真正关闭 window)并一次关闭 parent cmd.exe.
首先尝试 cmd.exe
最有意义
然后从那里了解 运行ning 从 visual studio
时的行为
CreateNoNewWindow 中的新词有点误导。它更像是不创建 window 甚至不使用 window.
如果您设置了 CreateNoNewWindow=false(默认值),那么它将 运行 child parent window 中的 cmd。 (这可能看起来很奇怪,但如果将它与 CreateNoNewWindow=true 时发生的情况进行比较,那么它并不那么奇怪)。当您 运行 程序时,您会看到它显示带有版权 e.t.c 的 cmd 横幅。这是来自 child cmd 运行ning 在 parent window.
如果您有 CreateNoNewWindow=true 并且您 运行 您的程序那么它不会输出任何内容。任务管理器仍将显示第二个 cmd.exe,这是因为它正在 运行 宁 child cmd.exe 但根本不在任何 cmd window 中。
现在是 visual studio.
中的行为
对于 Visual studio 控制台应用程序,当您单击播放时,visual studio 将弹出其 cmd window,该命令在程序完成后消失,但任何派生的进程都会继续存在。
使用 visual studio,如果您将 CreateNoNewWindow 设置为 true(即根本不使用 window),那么它将弹出其 cmd window,在中生成第二个 cmd没有 window,所以它是不可见的,然后 parent cmd window 将关闭并且生成的 child cmd.exe 将继续显示在任务管理器中,但不会window。因此任务管理器将显示一个 cmd.exe,而您将看不到 window。
作为测试下面段落之前的测试,您可以创建一个 cmd window、sdfsdfds
这样您就可以使用向上箭头访问命令历史记录中的内容,这样您就可以查看您是否在parenet 命令与否。然后启动一个child进程。输入 cmd<ENTER>
。现在杀死parent。 child 还在。
使用 visual studio,如果您将 CreateNoNewWindow 设置为 false(即使用 parent window),(如我们所见,即使在 parent 进程已经被杀死,如果 child 被创建并使用那个 window,在 parent 被杀死之前)然后点击播放,然后 visual studio 将弹出它cmd window,它会产生一个 child cmd.exe 进程,任务管理器只显示一个 cmd.exe 进程,但在 window 中,然后播放按钮再次显示为活动状态,因此程序必须已完成执行,并且 parent 过程已完成。所以 visual studio 关闭了 parent cmd.exe 但是 child 仍然在那里使用 parent 的 window 就像在 parent cmd.exe 正在完成。
当 visual studio 项目设置为控制台应用程序时,控制台将始终至少弹出。
但对于不是作为控制台应用程序创建的项目,例如对于 winforms 应用程序,可以将控制台设置为隐藏,并且即使对于主程序也不会弹出或根本不需要 运行。
注意这里 - UseShellExecute 和 CreateNoWindow 被设置为它们的非默认值。 UseShellExecute默认为true,我们设置为false是因为当UseShellExecute为true时CreateNoWindow会忽略自身的值(CreateNoWindow),并创建一个新的window(即使CreateNoWindow设置为true)。 CreateNoWindow 默认为 false,我们设置为 true。如果您要使用 CreateNoWindow,那么唯一非多余且有效的用例是 UseShellExecute=false 和 CreateNoWindow=true。 (如果 UseShellExecute=true(default) 那么你应该使用 process window 风格 hidden..)还要记住这些东西适用于 cmd.exe 但对于其他一些东西会失败,比如 calc.exe
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process.Start(psi);
通过正确理解CreateNoWindow,我终于找到了答案。
CreateNoWindow 是关于创建父 window,它将覆盖目标应用程序 main window.
CreateNoWindow = false;
=> 这将导致进程创建父级 window 来保存目标应用程序 window,而不是创建应用程序 window
WindowStyle = ProcessWindowStyle.Hidden;
=> 这将隐藏进程创建的父 window,而不是应用程序 window 样式
using (Process process = new Process())
{
process.StartInfo.FileName = @"notepad";
process.StartInfo.CreateNoWindow = false;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
}
我看过这里
我明白
A) 并非每个程序都尊重它的 CreateNoWindow 请求并且
B) 它需要 UseShellExecute=False(默认为 true)。
C) 表示是否创建了window。 (它永远不会隐藏父 window)。说的是是否为子进程创建了一个window。 (msdn 说 'new window')
D) CreateNoWindow 默认为 false。
我是从 cmd 运行 宁此的,尽管在 visual studio 中单击播放说明了相同的行为。
我将 CreateNoWindow 设置为 false,所以我认为它会为子进程创建一个新的 window。
但事实并非如此。
任务管理器显示了 cmd.exe 的第二个实例,但如您所见,仍然有一个 window。下面是一个 window 的粘贴。它已将子 cmd.exe 加载到父 window 中(一个命令 window)
如果我将 CreateNoWindow 设置为 true 或 false,那么它似乎没有什么区别。
所以我显然没有让 msdn link 上的示例正常工作。
C:\crp>type aaa.csc
using System.Diagnostics;
class blah{
public static void Main(string[] args) {
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute=false;
psi.FileName="cmd.exe";
psi.CreateNoWindow=false;
p.StartInfo=psi;
p.Start();
}
}
C:\crp>csc aaa.csc
Microsoft (R) Visual C# Compiler version 4.0.30319.34209
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
C:\crp>aaa.exe
C:\crp>Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\crp>
更新
看来确实有效。如果您打开 cmd 提示符和 运行 exe,那么在一种情况下它会在父级中启动 cmd.exe。在另一种情况下,它开始 cmd.exe 而没有任何 window。 visual studio 中的行为看起来很奇怪,请参阅我对以法莲答案的评论。在这个问题中,在 visual studio 内,我只尝试将项目设置为控制台应用程序,并且 cmd 提示 window 总是至少会弹出。对于非控制台应用程序,行为要简单得多,例如一个 winforms 应用程序。
尝试使用 Visual Studio 并为 cmd.exe
定义拉取文件路径public static void Main(string[] args) {
try
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "C:\Windows\System32\cmd.exe"; // full path
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process childProcess = Process.Start(psi); // child process
// This code assumes the process you are starting will terminate itself.
// Given that is is started without a window so you cannot terminate it
// on the desktop, it must terminate itself or you can do it programmatically
// from this application using the Kill method.
}
catch(Exception ex)
{
Console.WriteLine(e.Message);
}
}
我设置了 UseShellExecute=True;
....它似乎有效。
奇怪,没有那一行,你必须输入 exit 两次,一次到 'close' child cmd.exe (这并没有真正关闭 window)并一次关闭 parent cmd.exe.
首先尝试 cmd.exe
最有意义然后从那里了解 运行ning 从 visual studio
时的行为CreateNoNewWindow 中的新词有点误导。它更像是不创建 window 甚至不使用 window.
如果您设置了 CreateNoNewWindow=false(默认值),那么它将 运行 child parent window 中的 cmd。 (这可能看起来很奇怪,但如果将它与 CreateNoNewWindow=true 时发生的情况进行比较,那么它并不那么奇怪)。当您 运行 程序时,您会看到它显示带有版权 e.t.c 的 cmd 横幅。这是来自 child cmd 运行ning 在 parent window.
如果您有 CreateNoNewWindow=true 并且您 运行 您的程序那么它不会输出任何内容。任务管理器仍将显示第二个 cmd.exe,这是因为它正在 运行 宁 child cmd.exe 但根本不在任何 cmd window 中。
现在是 visual studio.
中的行为对于 Visual studio 控制台应用程序,当您单击播放时,visual studio 将弹出其 cmd window,该命令在程序完成后消失,但任何派生的进程都会继续存在。
使用 visual studio,如果您将 CreateNoNewWindow 设置为 true(即根本不使用 window),那么它将弹出其 cmd window,在中生成第二个 cmd没有 window,所以它是不可见的,然后 parent cmd window 将关闭并且生成的 child cmd.exe 将继续显示在任务管理器中,但不会window。因此任务管理器将显示一个 cmd.exe,而您将看不到 window。
作为测试下面段落之前的测试,您可以创建一个 cmd window、sdfsdfds
这样您就可以使用向上箭头访问命令历史记录中的内容,这样您就可以查看您是否在parenet 命令与否。然后启动一个child进程。输入 cmd<ENTER>
。现在杀死parent。 child 还在。
使用 visual studio,如果您将 CreateNoNewWindow 设置为 false(即使用 parent window),(如我们所见,即使在 parent 进程已经被杀死,如果 child 被创建并使用那个 window,在 parent 被杀死之前)然后点击播放,然后 visual studio 将弹出它cmd window,它会产生一个 child cmd.exe 进程,任务管理器只显示一个 cmd.exe 进程,但在 window 中,然后播放按钮再次显示为活动状态,因此程序必须已完成执行,并且 parent 过程已完成。所以 visual studio 关闭了 parent cmd.exe 但是 child 仍然在那里使用 parent 的 window 就像在 parent cmd.exe 正在完成。
当 visual studio 项目设置为控制台应用程序时,控制台将始终至少弹出。
但对于不是作为控制台应用程序创建的项目,例如对于 winforms 应用程序,可以将控制台设置为隐藏,并且即使对于主程序也不会弹出或根本不需要 运行。
注意这里 - UseShellExecute 和 CreateNoWindow 被设置为它们的非默认值。 UseShellExecute默认为true,我们设置为false是因为当UseShellExecute为true时CreateNoWindow会忽略自身的值(CreateNoWindow),并创建一个新的window(即使CreateNoWindow设置为true)。 CreateNoWindow 默认为 false,我们设置为 true。如果您要使用 CreateNoWindow,那么唯一非多余且有效的用例是 UseShellExecute=false 和 CreateNoWindow=true。 (如果 UseShellExecute=true(default) 那么你应该使用 process window 风格 hidden..)还要记住这些东西适用于 cmd.exe 但对于其他一些东西会失败,比如 calc.exe
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process.Start(psi);
通过正确理解CreateNoWindow,我终于找到了答案。 CreateNoWindow 是关于创建父 window,它将覆盖目标应用程序 main window.
CreateNoWindow = false;
=> 这将导致进程创建父级 window 来保存目标应用程序 window,而不是创建应用程序 window
WindowStyle = ProcessWindowStyle.Hidden;
=> 这将隐藏进程创建的父 window,而不是应用程序 window 样式
using (Process process = new Process())
{
process.StartInfo.FileName = @"notepad";
process.StartInfo.CreateNoWindow = false;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
}