2012-05-09 42 views
1

我只是使用WebBrowser控件在WinForm中加載PDF文件。我有一個PDF字節數組,當用戶在我的應用程序中單擊打印預覽時,我用它在客戶端機器的臨時文件夾中寫入。如何識別和關閉在C#中打開的應用程序的實例#

用戶關閉表單後,我需要刪除文件預覽後預覽。在刪除之前,我需要關閉已打開的Adobe Reader實例進行預覽。

我試圖讓使用

Process[] processes = Process.GetProcessesByName("AcroRd32"); 

我可以殺死進程通過這種手段和刪除臨時文件夾中的文件的進程的列表。這是實際的問題。假設用戶已經爲自己的目的打開了PDF文件,然後通過查找正在運行的實例並關閉它們,我也將關閉他的閱讀器。

有什麼方法可以找到我的應用程序打開的Adobe reader的實例。我只需要檢查Adobe Reader。沒有其他。

UPDATE

我已經打開手動adbobe讀者具有文件名或MainWindowTitle作爲Magazine.pdf first.Then我在打開的Adobe Reader由WebBrowser控件application.But它MainWindowTitle爲Empty.Also有建議立即進行刪除是Adobe Reader的兩個intance但在任務管理器它顯示了四個實例,並將它們只有一個具有MainWindowTitle作爲Magazine.pdf 請參閱以下圖片僅供參考

Four Process of reader

Last process with MainWindowTitle

+0

它似乎是不可能的,當你從瀏覽器中啓動它來識別它,因爲Acrobat查看在不同域中運行。爲什麼不顯示一個消息框給用戶該PDF文件正在使用中,而不是強制關閉它。你想強迫關閉它嗎?如果他點擊是,然後關閉實例 – Deepesh

+0

是否正確的方式來顯示當用戶關閉預覽窗口時打開閱讀器的警報。如果他單擊否,那麼我如何關閉預覽窗口 – Satheesh

+0

不,我是說維護一個標誌爲顯示預覽,當用戶關閉預覽窗口時設置該標誌,現在嘗試刪除它會給出異常,然後向用戶顯示該消息,pther程序正在使用的pdf是否應該關閉它? – Deepesh

回答

1

檢查每個Acrobat進程的MainWindowTitle - 所需的將以temp文件的名稱開頭。

+0

由我的應用程序打開的實例將MainWindowTitle設置爲Empty.Will在除此之外的任何時候都是空的。 – Satheesh

+0

它應該是臨時文件的名稱,我不得不看看你的代碼,看看有什麼可能是錯的。 – egrunin

+0

查看我的更新 – Satheesh

0

您可能會看看進程的MainWindowHandle屬性。

+0

MainHandleWindow將返回任何東西來標識已打開的實例 – Satheesh

+0

@Satheesh您是否直接在表單中顯示WebBrowser控件中的pdf?我是否正確地理解你? – animaonline

+0

你直接在瀏覽器控件中顯示pdf – Satheesh

0

我不打開使用WebBrowser的PDF,但我有一個類似的問題,當我使用Process.MainWindowTitle()。它似乎只返回一個不同於「」的最後打開的Acrobat實例的值。

我用它來尋找Acrobat中的所有過程中的C#代碼如下:

Process[] myProcess = Process.GetProcessesByName("AcroRd32"); 
    for (int i = 0; i < procesoProg.Length; i++) 
    { 
    if (myProcess[i].MainWindowTitle.Contains("MyTitle")) 
    { 
     myProcess[i].CloseMainWindow(); 
     Thread.Sleep(300); 
    } 
    } 

我嘗試使用Process.Kill()代替Process.MainWindow(),但它會關閉Acrobat中的所有實例,不僅是一個我想要的。

如果你只是想關閉你從你的應用程序中打開該文檔,你可以存儲過程中,當您啓動PDF,並使用CloseMainWindow()當你想關閉它:

private static Process myProcess = null; 

    public void OpenPDF() 
    { 
     myProcess = new Process(); 
     myProcess.StartInfo.FileName = "AcroRd32.exe"; 
     myProcess.StartInfo.Arguments = " /n /A \"pagemode=bookmarks&nameddest=" + strND + "\" \"" + strPath + "\""; 
     myProcess.Start(); 
    } 

    public void ClosePDF() 
    { 
     // If there is 
     if (myProcess!= null) 
     { 
      myProcess.CloseMainWindow(); 
      Thread.Sleep(500); 
     } 
    } 

我希望這個代碼可以幫你。

0

如果你想刪除WebBrowser控件打開一個PDF文件,你必須使用此代碼:

WebBrowser.Navigate(YourPdfPath) 
... 
WebBrowser.Navigate("about:blank") 
Application.DoEvents() 
Dim millisecondsTimeout = 5000 
While True 
    Try 
    File.Delete(YourPdfPath) 
    Exit While 
    Catch ex As IOException 
    If millisecondsTimeout < 0 Then Exit Sub 
    millisecondsTimeout -= 100 
    Thread.Sleep(100) 
    End Try 
End While 

UPDATE:

我發現擴展方法殺死一個進程的孩子進程:

<Extension> 
    Public Sub KillChildren(process As Process, Optional processNameToKill As String = "", Optional recursive As Boolean = False) 
     Static ProcessIDStack As List(Of Integer) = New List(Of Integer) 
     If ProcessIDStack.Contains(process.Id) Then 
      Exit Sub 
     Else 
      ProcessIDStack.Add(process.Id) 
     End If 

     Dim searcher = New ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" & process.Id) 'MLHIDE 
     Dim moc As ManagementObjectCollection = searcher.Get 
     For Each mo As ManagementObject In moc 
      Try 
       Dim ChildProcess = process.GetProcessById(Convert.ToInt32(mo("ProcessID"))) 'MLHIDE 
       If recursive Then 
        ChildProcess.KillChildren(processNameToKill, recursive) 
       End If 
       If (Not ChildProcess.HasExited) AndAlso (processNameToKill = String.Empty OrElse ChildProcess.ProcessName = processNameToKill) Then 
        ChildProcess.Kill() 
        ChildProcess.WaitForExit(1000) 
       End If 
      Catch ex As ArgumentException 
       ' process already exited 
      Catch ex As InvalidOperationException 
       ' process already exited 
      Catch ex As ComponentModel.Win32Exception 
       ' process already exited 
      End Try 
     Next 

     ProcessIDStack.Remove(process.Id) 
    End Sub 

... 
    WebBrowser.Navigate("about:blank") 
    Process.GetCurrentProcess.KillChildren("AcroRd32", True) 
    Application.DoEvents() 
... 

我在尋找一個更好的方法來檢查文件是否沒有使用避免在循環中睡覺(安德魯·巴伯正確地說,這不是一個好的代碼...),但I D idn't發現別的,對不起......

(感謝Andrew理髮)

+0

真的嗎? *睡在一個循環*? –

相關問題