在 Winform 中关闭 Adobe 预览进程





4.00/5 (3投票s)
如何在 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());
}
}