2013-11-25 46 views
1

我跟着this ask,打開這樣一個過程,關閉IE進程,失敗的user32.dll中的函數調用

// open IE (ok) 
Process process = System.Diagnostics.Process.Start("IEXPLORE.EXE", "www.google.com"); 
IntPtr handle = process.Handle; 

// refresh it (ok) 
[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

ShowWindow(handle, 1); 
SendKeys.SendWait("{F5}"); 

// however, fail to close it (NOT ok) 
[DllImport("user32.dll")] 
static extern bool CloseWindow(IntPtr hWnd); 

CloseWindow(handle); // don't work 

沒有錯誤,沒有異常發生。我檢查了關於CLoseWindow的MSDN,但仍然失敗。有關它的任何想法?謝謝 !

更新: 好的,我修正了它,使它更加健壯。 調用這個過程的CloseMainWindow()函數的工作

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

bool bOk = ShowWindow(process.MainWindowHandle, 1); 
if (bOk) { 
    bOk = SetForegroundWindow(process.MainWindowHandle); 
    if (bOk){ 
     process.CloseMainWindow(); 
    } 
} 
+0

的ShowWindow()返回布爾。 *永遠不會忽略winapi返回值。 –

+0

thx提醒我 – Kevin

回答

0

抱歉回答我自己的問題。實際上,如果沒有@ fejesjoco的提醒,我無法找到答案。我真的很感激。

答案是調用這個過程的CloseMainWindow()函數,這樣

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

bool bOk = ShowWindow(process.MainWindowHandle, 1); 
if (bOk) { 
    bOk = SetForegroundWindow(process.MainWindowHandle); 
    if (bOk){ 
     process.CloseMainWindow(); 
    } 
} 
1

Process.Handle是一個進程句柄,而不是一個窗口句柄,所以窗口的命令將不會進行這項工作。嘗試使用Process.MainWindowHandle屬性。請注意,如果IE產生額外的進程或打開額外的窗口,這整個事情可能無法正常工作。

+0

如果我可以確定它是IE的進程並獲得它的窗口句柄,這是否意味着沒有任何額外的進程可能會得到處理?我試圖得到MainWindowHandle而不是處理屬性,現在它運行得更好。謝謝。 – Kevin