1

WebBrowserコントロールを使用してWinFormにPDFファイルをロードするだけです。私はPDFバイト配列を持っており、ユーザーがアプリケーションの印刷プレビューをクリックしたときに、これをクライアントマシンの一時フォルダーに書き込んでいました。

プレビュー後、ユーザーがフォームを閉じたときにファイルを削除する必要があります。削除する前に、プレビュー用に開いたAdobeReaderのインスタンスを閉じる必要があります。

を使用してプロセスのリストを取得してみました

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

これでプロセスを強制終了し、一時フォルダからファイルを削除できます。ここに実際の問題があります。ユーザーが自分の目的ですでにPDFファイルを開いていると仮定し、実行中のインスタンスを見つけてそれらを閉じることにより、リーダーも閉じます。

私のアプリケーションによって開かれたAdobeリーダーのインスタンスを見つける方法はありますか?AdobeReaderのみを確認する必要があります。他にはありません。

アップデート

最初にファイル名またはMainWindowTitleをMagazine.pdfとして持つadbobeリーダーを手動で開きました。次に、アプリケーションでwebbrowserコントロールを使用してadobeリーダーを開きました。ただし、MainWindowTitleを空にします。 4つのインスタンスとそのうちの1つだけがMagazine.pdfとしてMainWindowTitleを持っています参照用に以下の画像を参照してください

リーダーの4つのプロセス

MainWindowTitleを使用した最後のプロセス

4

4 に答える 4

1

各AcrobatプロセスのMainWindowTitleを確認します。必要なプロセスは一時ファイルの名前で始まります。

于 2012-05-09T13:25:07.987 に答える
0

プロセスのMainWindowHandleプロパティを確認してください。

于 2012-05-09T12:51:58.187 に答える
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);
        }
    }

このコードがお役に立てば幸いです。

于 2012-05-17T14:16:14.647 に答える
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

アップデート:

プロセスの子プロセスを強制終了する拡張メソッドを見つけました。

  <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()
...

ループ内でスリープしないようにファイルが使用されていないかどうかを確認するためのより良い方法を探しています(Andrew Barberは、これは適切なコードではないと正しく言っています...)が、他に何も見つかりませんでした。申し訳ありません。 。

(Andrew Barberに感謝します)

于 2012-09-06T10:35:40.323 に答える