C# - 命令窗口在消失之前出现十分之一秒

时间:2016-04-27 14:53:39

标签: c# visual-studio-2010

我正在尝试在进程启动时隐藏命令窗口。我使用此ProcessStartInfo配置启动McAfee病毒扫描:

document

然后,我尝试:

window

还有:

ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.FileName = args[0];
...
procInfo.RedirectStandardOutput = true;
procInfo.WindowStyle = ProcessWindowStyle.Hidden;
procInfo.CreateNoWindow = false;
procInfo.UseShellExecute = false;
process.StartInfo = procInfo;

但是在两种情况下都会出现命令窗口,在它完全显示之前,它会消失(就像最大化窗口一样,并立即将其最小化)。我还玩过所有可能的ProcessStartInfo属性组合。我不需要随时显示任何窗口。我怎么能实现这一目标?提前谢谢!

1 个答案:

答案 0 :(得分:0)

对于问题中显示的代码块,行为是正常的。

让我们来看看......

//[...]
procInfo.CreateNoWindow = false; //That's not what you meant
procInfo.UseShellExecute = false;
process.Start(); //Will show up the console window
process.CloseMainWindow(); //Will close the main window (probably also the whole application)

process.Start();process.CloseMainWindow();之间是一个很短的时间范围,应用程序可见。

如同@BugFinder描述的那样,将CreateNoWindow值从false编辑为true就足够了。
检查一下是否有效。

您的第二次尝试让您离得更远:

process.Start();
while (process.MainWindowHandle == IntPtr.Zero)
{
   process.Refresh(); //Let's do this as long as there is no window...
}
var handle = process.MainWindowHandle; //This occurs, when there is *already* a window.
ShowWindow(handle, 0) //ShowWindow from user32.dll

使用Shell函数的想法基本上不错,但是这段代码与上面的代码一样(并且也是非托管的)。

让我们尝试一种不同的方式,并从PInvoke.Net 中获取 C#示例:(管理不比ShowWindow()......)

public static void StartupNotepad()
{
     const uint NORMAL_PRIORITY_CLASS = 0x0020;
     const uint STARTF_USESHOWWINDOW = 0x1;     //IMPORTANT for you
     bool retValue;
     string Application = Environment.GetEnvironmentVariable("windir") + @"\Notepad.exe";
     string CommandLine = @" c:\boot.ini";  //Funny
     PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();
     STARTUPINFO sInfo = new STARTUPINFO();
     sInfo.wShowWindow = 0;                     //IMPORTANT for you - See http://pinvoke.net/default.aspx/Enums/ShowWindowCommand.html
     sInfo.dwFlags = STARTF_USESHOWWINDOW;      //IMPORTANT for you
     SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
     SECURITY_ATTRIBUTES tSec = new SECURITY_ATTRIBUTES();
     pSec.nLength = Marshal.SizeOf(pSec);
     tSec.nLength = Marshal.SizeOf(tSec);
     retValue = CreateProcess(Application,CommandLine,
     ref pSec,ref tSec,false,NORMAL_PRIORITY_CLASS,
     IntPtr.Zero,null,ref sInfo,out pInfo);

     Console.WriteLine("Process ID (PID): " + pInfo.dwProcessId);
     Console.WriteLine("Process Handle : " + pInfo.hProcess);
}

此示例演示了以非常静态的方式使用CreateProcess(底部的MSDN Link) 我建议你写一个更动态的功能并玩它。 PROCESS_INFORMATION结构允许您稍后在应用程序中操作新创建的进程。如果你的问题仍然存在,使用CreateProcess()调用,它将检查启动的应用程序是否自己做了一些棘手的事情。最后但并非最不重要的是,问题是否不仅发生在您的计算机上......

以下是一些参考资料:

修改

可能是一种解决方法,但如果您的第三方应用程序旨在显示一个窗口并试图忽略您的请求,STARTUPINFO也有dwXdwY,这会设置Window&# 39; dwFlags指定STARTF_USEPOSITION时的位置。 dwXSizedwYSize相同。

如果所有其他方法都失败了,您可以尝试一下并传递位置和大小,这会使进程看起来不可见。欢呼声。