65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Winform 中关闭 Adobe 预览进程

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2016 年 9 月 28 日

CPOL

1分钟阅读

viewsIcon

7801

如何在 Winform 中关闭 Adobe 预览进程

自从 Adobe DC 以来,我们在桌面应用程序中打印或预览 PDF 文档时遇到了一些问题。

桌面应用程序之前使用 WebBrowser 组件,但现在我们已经将其迁移到使用 Adobe PDF Reader COM (axAcroPDF) 组件来预览 PDF 文档。

自从 DC 和新组件发布后,我发现预览对话框需要 x 秒才能关闭。

当文档似乎已经关闭时,就会发生这种情况,但它正在等待某些操作才能关闭 Winform。(这可能会导致应用程序看起来崩溃!非常糟糕

现在我能够创建一个解决方案,该方案将关闭 PDF 文档并终止 Adobe 进程。这仅针对与父 Winform 应用程序关联的进程。所有其他 PDF 文档或 Adobe 进程都将保持活动状态。

从进程中获取父 ID
这将从系统进程中获取当前应用程序进程 ID(父进程 ID) 

 private static int GetParentProcessId(Process p)
        {
            int parentId = 0;
            try
            {
                ManagementObject mo = new ManagementObject("win32_process.handle='" + p.Id + "'");
                mo.Get();
                parentId = Convert.ToInt32(mo["ParentProcessId"]);


            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                parentId = 0;
            }


            return parentId;
        }

所需引用:System.Management 

获取 PDF 文档标题
如果文档包含标题,以下逻辑将使用 ITextSharp 来检查 PDF

  private static void getDocumentTitle()
        {
            iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(documentPath);
            documentTitle = reader.Info["Title"];
        }

终止进程
以下方法终止单个进程

       private static void killSingleProcess(Process process)
        {
            try
            {
                if (process != null)
                {
                    process.Kill();
                }

            }catch(Exception e)
            {
                    Console.WriteLine(e.ToString());
            }
        }

获取 Adobe 进程
所有内容都汇集于此!
它将获取所有 Adobe 进程、父进程 ID,然后终止所有与父进程 ID 关联的进程

public static void Adobe(string path)
        {
            documentPath = path;
            Utilities.DebugSolution.SetMessageUniqueFile("Printing", "Kill Adobe process");
            try
            {
                processes = Process.GetProcessesByName("AcroRd32");
                var desktopProcess = Process.GetProcessesByName("[DESKTOP PROCESS NAME]");               

                getDocumentTitle();
                if(desktopProcess != null || desktopProcess .Count() >0)
                {
                    var desktopProcessId =  hdProcess[0].Id;
                    foreach (Process process in processes.Where(x => x.MainWindowTitle.Equals(documentTitle, StringComparison.OrdinalIgnoreCase) || x.MainWindowTitle.Equals("")).ToList())
                    {
                        var parentProcess = GetParentProcessId(process);
                        if(parentProcess.Equals(desktopProcessId))
                       {
                            killSingleProcess(process);
                        }
                        
                    }
                }
                
               
            }catch(Exception e)
            {
                    Console.WriteLine(e.ToString());
            }
       
        }
© . All rights reserved.