2016-04-27 76 views
0

我試圖在進程啓動時隱藏命令窗口。我用這個的ProcessStartInfo配置啓動McAfee病毒掃描:C# - 命令窗口在消失前出現十分之一秒

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

然後,我嘗試:

process.Start(); 
process.CloseMainWindow(); 

而且也:

process.Start(); 
while (process.MainWindowHandle == IntPtr.Zero) 
{ 
    process.Refresh(); 
} 
var handle = process.MainWindowHandle; 
ShowWindow(handle, 0) //ShowWindow from user32.dll 

但在這兩種情況下,命令窗口出現,它是前完全顯示,它會消失(就像最大化窗口並立即將其最小化)。我也玩過所有可能的ProcessStartInfo屬性組合。我不需要任何時間顯示窗口。我怎麼能做到這一點?提前致謝!

+0

在任務計劃程序中安排您的EXE – techspider

+0

set CreateNoWindow = false;是真實的? – BugFinder

+0

@techspider,這是更大的過程的一部分,我不能安排它:( – AdSsa

回答

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的值應該足夠從falsetrue
檢查是否有效。

你的第二次嘗試是讓你漸行漸遠:

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鏈接的在底部)以非常靜態的方式。
我建議你寫一個更加動態的功能並且玩弄它。 PROCESS_INFORMATION結構允許您稍後在應用程序中操作新創建的進程。如果您的問題仍然使用CreateProcess()調用持續存在,那就是檢查啓動的應用程序是否對自己做了一些棘手的事情。最後但並非最不重要的問題是否問題不僅發生在您的計算機上...

這裏有一些更多的參考資料:

編輯:

可能是一個解決辦法,但如果您的第三方應用程序的目的是顯示一個窗口,並試圖忽略你的請求,STARTUPINFO也有dwXdwY,其設置窗口的位置,如果dwFlags指定STARTF_USEPOSITIONdwXSizedwYSize相同。

如果一切都失敗了,您可以嘗試並通過位置和大小,這使得顯示。乾杯。

+0

爲了捕獲和重定向輸出,關閉進程或捕獲窗口處理程序,啓動McAfee Scan比記事本更復雜。 'CreateProcess()'。:) – AdSsa

+0

'爲了捕獲和重定向輸出'這是['PROCESS_INFORMATION'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684873%28v = vs.85%29.aspx)被引用。 – Clijsters

相關問題