2012-04-30 122 views
5

我試圖在Visual C#2010 - Windows窗體應用程序中啓動外部進程。我們的目標是以隱藏窗口的形式啓動流程,並在稍後取消隱藏窗口。如何在C#中隱藏/取消隱藏進程?

我已經更新了我的進步:

//Initialization 
[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); 
[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enable); 
[DllImport("user32.dll")] 
private static extern bool MoveWindow(IntPtr handle, int x, int y, int width, 
int height, bool redraw); 

SW_SHOW = 5; 

下被放置在我的主要功能:

ProcessStartInfo info = new ProcessStartInfo("process.exe"); 
info.WindowStyle = ProcessWindowStyle.Hidden; 
Process p = Process.Start(info); 

p.WaitForInputIdle(); 
IntPtr HWND = p.MainWindowHandle; 

System.Threading.Thread.Sleep(1000);  

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 
MoveWindow(HWND, 0, 0, 640, 480, true); 

然而,因爲窗口開始爲 「隱藏」,p.MainWindowHandle = 0。我無法成功顯示窗口​​。我也試過HWND = p.Handle沒有成功。

有沒有辦法給我的窗口提供一個新的句柄?這可能會解決我的問題。

參考文獻:

MSDN ShowWindow

MSDN Forums

How to Import .dll

+1

隱藏的程序? (狡猾) - 或隱藏表單? –

+0

隱藏進程的窗口。爲了說明方便,我們假設它是Internet Explorer:'ProcessStartInfo info = new ProcessStartInfo(「iexplore」);' –

+0

CreateNoWindow僅適用於控制檯模式應用程序。隱藏需要一個GUI應用程序來協作,並注意Windows傳遞給它的WinMain()函數的'nCmdShow'參數。然而這經常被忽略。除了聯繫店主之外,你無能爲力。 –

回答

10

最後,該過程是否正常運行。感謝您的所有幫助,我想出了這個修復方案。

p.MainWindowHandle爲0,所以我不得不使用user32 FindWindow()函數來獲取窗口句柄。

//Initialization 
int SW_SHOW = 5; 

[DllImport("user32.dll",SetLastError=true)] 
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, WindowShowStyle nCmdShow); 

[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enabled); 

在我的主要功能:

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "notepad"; 
info.UseShellExecute = true; 
info.WindowStyle = ProcessWindowStyle.Hidden; 

Process p = Process.Start(info); 
p.WaitForInputIdle(); 
IntPtr HWND = FindWindow(null, "Untitled - Notepad"); 

System.Threading.Thread.Sleep(1000); 

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 

參考文獻:

pinvoke.net: FindWindow()

+0

嗨馬特感謝分享。我知道這是遲到了,但是當我嘗試這段代碼時,Visual Studio無法識別'WindowShowStyle'。我檢查了您提供的所有鏈接,但無法找到此類型的任何提及 - 請讓我知道這是從哪裏來的? (我指的是'ShowWindow'導入聲明中第二個參數的類型) – Bassie

1

的機制的文檔細節,使用ProcessWindowStyle.Hidden你還必須設置ProcessStartInfo.UseShellExecute爲false。 http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

您將不得不以某種方式知道窗口句柄以後取消隱藏它。

+0

請提供文件。測試顯示'ProcessStartInfo.UseShellExecute = true'是'ProcessWindowStyle.Hidden'工作的唯一方式。 –

+1

在MSDN上查找ProcessWindowStyle;但我已經爲你添加了鏈接。 –

+0

謝謝。不幸的是,無論出於何種原因,它在我的情況下都不起作用。如上所述,我測試了'true'和'false'。當使用'false'時,窗口無法隱藏。 –

2

示例代碼取消隱藏窗口:

int hWnd; 
Process[] processRunning = Process.GetProcesses(); 
foreach (Process pr in processRunning) 
{ 
    if (pr.ProcessName == "notepad") 
    { 
     hWnd = pr.MainWindowHandle.ToInt32(); 
     ShowWindow(hWnd, SW_HIDE); 
    } 
} 
+0

讓我試試這個,當我回家。如果它有效,我會接受它。沒有找到窗口方法嗎? –

+0

重新閱讀本文之後,我還有其他疑慮。沒有辦法知道pr是* my *過程。例如,如果我的程序打開兩個記事本窗口怎麼辦?我想知道是否有更好的方法來確定我打開的窗口。 –