當我開始一個新的進程,這有什麼區別,如果我使用.NET - WindowStyle =隱藏與CreateNoWindow = true?
WindowStyle = hidden
或ProcessStartInfo
類的
CreateNoWindow = true
財產?
當我開始一個新的進程,這有什麼區別,如果我使用.NET - WindowStyle =隱藏與CreateNoWindow = true?
WindowStyle = hidden
或ProcessStartInfo
類的
CreateNoWindow = true
財產?
正如漢斯說,WindowStyle是一個傳遞給流程的建議,應用程序可以選擇忽略它。
CreateNoWindow控制控制檯如何爲子進程工作,但它不能單獨工作。
CreateNoWindow協同工作與UseShellExecute如下:
沒有任何窗口中運行的進程:
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = true;
info.UseShellExecute = false;
Process processChild = Process.Start(info);
要在自己的窗口中運行的子進程(新的控制檯)
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = true; // which is the default value.
Process processChild = Process.Start(info); // separate window
在父級控制檯窗口中運行子進程
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = false; // causes consoles to share window
Process processChild = Process.Start(info);
CreateNoWindow僅適用於控制檯模式的應用程序,它不會創建控制檯窗口。
WindowStyle僅適用於本機Windows GUI應用程序。這是一個傳遞給這樣一個程序的WinMain() entry point的提示。第四個參數nCmdShow,告訴它如何顯示它的主窗口。這與在桌面快捷方式中顯示爲「運行」設置的提示相同。請注意,「隱藏」不是一種選擇,很少有正確設計的Windows程序可以滿足該請求。由於這個窺探用戶,他不能再讓程序被激活,只能用任務管理器殺死它。
使用反射器,如果設置了UseShellExecute
,則使用WindowStyle
,否則使用CreateNoWindow
。
在MSDN的例子,你可以看到他們是如何設置:
// Using CreateNoWindow requires UseShellExecute to be false
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
在另一個例子,它的正下方,因爲UseShellExecute
默認爲真
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
我同意,也同意我的測試。 msdn有反向? https://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx他們說:「要使用ProcessWindowStyle.Hidden,ProcessStartInfo.UseShellExecute屬性必須爲false。」 < - 我相信MSDN有它倒退 – barlop 2016-04-25 06:31:10
有一件事值得在這裏注意到,我學會了艱難的方法:如果你創建一個進程,然後修改它的StartInfo,你會得到一個不同的行爲,如果你想創建一個ProcessStartInfo然後使用的Process.Start()。具體來說,前者似乎並不尊重CreateNoWindow。 – 2011-05-24 22:04:21
@AriRoth你能給出一個代碼示例嗎?您必須先創建一個流程,然後才能修改其StartInfo。人們總會說process1.StartInfo =某事。因此,您必須先創建流程,然後再將您分配給Process1.StartInfo的ProcessStartInfo實例作爲其他任何操作。 – barlop 2016-04-24 23:50:44
@AriRoth,即使你做'Process process = Process.Start(psi);'而不是'process。開始()'我不確定是否有任何行爲差異,並且您在創建過程之前仍然在設置StartInfo。 – barlop 2016-04-25 01:14:24