2013-08-22 38 views
0

需要检测当前活动文件的路径,例如,我的程序应该在后台运行(没问题),当你输入一个特殊的快捷方式时,必须查看前台的文件(pdf/a doc/whatever),并找出这个文件的路径。
这是可能的,如果是的话,怎么样?我在Windows机器上使用C++。
非常感谢您!检测当前活动文件的路径

+0

通常情况下,您会将当前打开的文件的文件路径保存在变量中,并从中知道。它是你程序状态的一部分。 –

+2

您可以在此上下文中定义背景和前景吗?你的意思是屏幕上或过程明智吗? – enhzflep

+0

您能否更详细地描述一下您实际尝试实现的目标?所以,如果有人在Word中打开“my_work.doc”,你想用它做什么?为什么这条道路很重要? –

回答

0

给定一个进程ID

如果你知道文件的PID(进程ID),你可以使用windows API,你提到你在Windows中,通过使用EnumProcesses进程列表枚举然后使用OpenProcess返回一个句柄,您可以使用GetModuleFileNameEx

这里的链接应该提供足够的信息来使用API​​。基本原则是识别给定处理或进程ID的进程,然后使用Windows API获取所需的信息。

给定文件句柄

如果你有一个句柄的文件,你可以看看看GetFinalPathNameByHandle在Vista或更高版本。虽然链接还提供了使用先前版本的文件映射的信息。

正如其他人所说,如果您自己打开文件,您可能只想使用状态来维护最初使用的位置。

+0

这适用于.exe和.dll。如果有人打开一个文件“my_work.doc”,我不认为有一个官方的API来找到该文件的名称 - 虽然显然有一种方法可以做到这一点,因为ProcessExplorer可以做到这一点 - 但它不解释它如何在我知道的任何地方工作。 –

+0

我假设有'my_work.doc'的文件句柄,在MSDN上快速搜索显示Vista或更高版本有GetFinalPathNameByHandle,我将编辑 – chrisw

+0

@MatsPetersson:ProcExp将显示命令行IIRC。但是,如果我打开记事本,并使用“另存为...”,您可能需要新文件。记事本不会保持文件句柄打开,所以这也不是解决方案。如果这甚至不能用记事本工作,那么这将会如何可靠? – MSalters

0

在Linux上,我会使用lsof - 列出打开的文件和grep这些,这很有趣。 过程监视器或文件监视器(Sysinternals公司)

我觉得这是一个非常类似的问题的Windows批处理模式:(也许这就是为什么你赢得-1)How can I determine whether a specific file is open in Windows?

+0

这不是一个类似的问题,因为那样你只知道一个特定的文件是否已经打开,但是你不知道哪个文件是当前活动的文件。 –

0

找到解决我的问题的方法:我可以使用WinAPI函数“FindWindow”和“GetWindowText”。