让我先谈谈我最初想要做的事情:在Windows中,我希望能够使用我定义的全局键盘快捷键(例如, Ctrl < / kbd> + Alt + C )将前台应用程序中打开文档的完整路径和文件名复制到剪贴板。
这对于例如能够随后粘贴路径和路径是有用的。将文件名放入电子邮件客户端的“打开文件”对话框中,以将该文档附加到电子邮件中,而无需手动浏览到文件系统中的目标文档。
现在,如何执行此操作的具体部分我对如何实现感兴趣:如何获取任何当前运行的Windows应用程序的当前“打开文档”的路径和文件名(如果使用任何 Windows应用程序无法做到这一点,那么下一个最好的办法就是尽可能多地处理这些应用程序。)
显然,这不适用于某些应用程序,这些应用程序不一定具有与本地文件系统上的文件对应的“当前打开的文档”的概念,例如电子邮件客户端,IM客户端或(通常)网络浏览器。
我知道可以编写特定于应用程序的解决方案来执行此操作。例如,以下MS Word VBA子例程将Word中打开文档的文件名和路径复制到剪贴板:
Dim myDataObject As DataObject
Set myDataObject = New DataObject
myDataObject.SetText ActiveDocument.FullName
myDataObject.PutInClipboard
但是,我真正想要的是能够对我系统上的任何应用程序起作用的东西(或者,对于尽可能多的应用程序而言),而不必尝试为每个应用程序编写特定于应用程序的解决方案。
一个想法:可以以某种方式利用Recent Documents文件夹(和/或其底层Windows API)来帮助解决这个问题吗?它似乎有关于我在这里感兴趣的“开放文档”的相同概念的信息,这显然适用于各种应用程序类型。 (查看我机器上Recent Documents文件夹的内容,我看到那里的条目显然是我用各种应用程序打开的文件,包括MS Word,MS Excel,Eclipse,Adobe Acrobat Reader,Paint.NET,TOAD,和Notepad2。)
我更喜欢 C#或C ++代码中的解决方案,但无论实现语言如何,我都愿意接受有关如何执行此操作的任何建议!
2009年11月更新:现在Windows 7已经广泛使用,我认为可能值得回到这个问题并询问:Windows 7是否提供任何新的API或任何其他机制,那会对我在这里想要完成的事情有所帮助吗?
答案 0 :(得分:2)
应用程序没有强制机制来指定其打开的文档,因此这通常不可能。
答案 1 :(得分:2)
您可能做的最好的事情是查看最近的文档注册表项,并获取最新文档的列表。用于处理此数据的一些示例代码位于this CodeProject article。这保存在:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
但是,这不会向您显示文档当前是否已打开。您可以检查所有打开的应用程序的标题,因为许多应用程序将文档名称放在其窗口标题中,但这不是必需的,许多应用程序不这样做。