如何获取Adobe Reader已打开文件的路径?C#实现可行吗?
嘿,我来帮你搞定这两个关于Adobe Reader文件路径的问题!
一、如何获取Adobe Reader已打开文件的路径
有几种实用的方式可以拿到这个路径,分手动操作和技术手段两类:
- 手动查看界面:打开Adobe Reader后,窗口标题栏通常会显示文件名和完整路径(如果路径没被窗口宽度截断的话);或者点击顶部菜单栏的
文件→属性,在弹出的属性窗口里,位置字段就是文件的完整路径。 - 通过Windows任务管理器:按下
Ctrl+Shift+Esc打开任务管理器,切换到详细信息标签页,找到AcroRd32.exe(或新版本的AcroRd64.exe)进程,右键选择属性,在命令行字段里就能看到包含PDF文件路径的启动参数,展开后即可查看完整路径。
二、用C#实现获取Adobe Reader已打开文件的路径
当然可以!这里给你两种靠谱的实现思路,适配不同场景:
方法1:遍历进程解析命令行参数
这种方法不依赖Adobe的专属组件,通用性更强,适合大多数环境。核心逻辑是找到所有Adobe Reader进程,读取它们的命令行参数并提取PDF路径。
using System; using System.Diagnostics; using System.Management; class AdobePathGetter { static void Main() { // 根据你的Adobe Reader版本调整进程名,旧版本是AcroRd32.exe,新版本可能是AcroRd64.exe string targetProcess = "AcroRd32"; var adobeProcesses = Process.GetProcessesByName(targetProcess); foreach (var process in adobeProcesses) { try { string commandLine = GetProcessCommandLine(process); if (!string.IsNullOrWhiteSpace(commandLine)) { // 提取命令行中引号包裹的PDF路径(适配带空格的路径) int quoteStart = commandLine.IndexOf('"'); int quoteEnd = commandLine.IndexOf('"', quoteStart + 1); if (quoteStart != -1 && quoteEnd != -1) { string pdfPath = commandLine.Substring(quoteStart + 1, quoteEnd - quoteStart - 1); Console.WriteLine($"已打开的PDF路径:{pdfPath}"); } } } catch (Exception ex) { Console.WriteLine($"读取进程信息失败:{ex.Message}"); } finally { process.Dispose(); } } } // 辅助方法:通过WMI获取进程的完整命令行 private static string GetProcessCommandLine(Process process) { using (var searcher = new ManagementObjectSearcher( $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}")) { foreach (var obj in searcher.Get()) { return obj["CommandLine"]?.ToString(); } } return null; } }
注意:这个方法需要在项目中引用System.Management程序集,且运行程序时可能需要管理员权限才能读取所有进程的命令行信息。
方法2:使用Adobe Reader的COM接口
如果你的环境中安装了Adobe Reader的COM组件,可以直接通过官方接口获取路径,准确性更高。
- 先在C#项目中添加COM引用:右键项目→
添加→引用→COM,找到Adobe Acrobat Reader DC Type Library(或对应版本的AcroPDFLib)并勾选。 - 然后使用以下代码实现:
using AcroPDFLib; class AdobeComPathGetter { static void Main() { try { var acroApp = new AcroPDF(); if (acroApp.GetNumDocs() > 0) { // 获取第一个已打开的文档(可循环遍历GetNumDocs()返回的数量) var openedDoc = acroApp.GetDoc(0); string pdfPath = openedDoc.Path; Console.WriteLine($"已打开的PDF路径:{pdfPath}"); } else { Console.WriteLine("Adobe Reader当前没有打开任何文档"); } } catch (Exception ex) { Console.WriteLine($"操作失败:{ex.Message}"); } } }
注意:这种方法依赖Adobe Reader的版本,不同版本的COM库可能存在差异;如果用户的Adobe Reader未注册COM组件,可能会触发报错。
内容的提问来源于stack exchange,提问作者Vitor Matos
相关产品推荐
相关产品推荐

