2013-08-22 39 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」。