桌面应用程序优化:从WebBrowser到Adobe PDF Reader的迁移

在现代软件开发中,桌面应用程序的性能和用户体验至关重要。随着技术的发展,经常需要更新应用程序以使用更高效、更稳定的组件。本文将探讨一个桌面应用程序从使用WebBrowser组件迁移到使用Adobe PDF Reader组件进行PDF文档预览的过程,以及如何解决迁移后出现的关闭延迟问题。

在迁移之前,桌面应用程序使用WebBrowser组件来预览PDF文档。然而,随着用户需求的增长和对性能要求的提高,决定迁移到Adobe PDF Reader的COM组件(axAcroPDF),以期获得更好的性能和用户体验。

迁移后的挑战

迁移到Adobe PDF Reader后,遇到了一个新问题:预览对话框在文档关闭后需要额外的x秒才能关闭。这导致用户界面看起来像是卡住了,甚至像是应用程序崩溃了,这对用户体验非常不利。

解决方案

为了解决这个问题,开发了一个解决方案,它可以关闭PDF文档并终止与父窗体应用程序相关的Adobe进程。这样,所有其他PDF文档或Adobe进程将保持活动状态。

首先,需要获取当前应用程序进程ID(父进程ID)。以下代码段展示了如何使用System.Management命名空间来实现这一点:

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; }

如果文档包含标题,以下逻辑使用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()); } } 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("")) { var parentProcess = GetParentProcessId(process); if (parentProcess.Equals(desktopProcessId)) { killSingleProcess(process); } } } } catch (Exception e) { Console.WriteLine(e.ToString()); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485