• 締切済み

表示されているファイルの完全パスの取得

Windows上で、最前面に表示されているOfficeファイルの 完全パスを取得したいのですが、方法がわかりません。 GetForegroundWindowにてハンドルを取得し、 GetWindowThreadProcessId → EnumProcessModules → GetModuleFileNameExで、取得できるのは当然のことながら、 起動したOfficeアプリの完全パス(C:\Program Files~\POWERPNT.EXE等)に なってしまいます。 取得したいのは、アプリの完全パスではなく、 ファイル自体の完全パス(C:\Documents and Setting~新規ファイル.ppt等)なんですが、 どうにかして、最前面に表示されているウィンドウ(Officeアプリ)から 表示しているファイル自体の完全パスを取得する方法はないでしょうか? よろしくお願いします。 開発環境:Visual Studio2008 / C++プロジェクト

みんなの回答

  • jmh
  • ベストアンサー率23% (71/304)
回答No.7

Excel を起動して、irotview.exe を見てみたら、Book1 と Excel の CLSID が載ってたので、ROT を起点して ActiveWindow を取り出せる気がします。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.6

まず、起動してるアプリケーションの中でアクティブなファイル(Word でいうところの ActiveDocument や Excel での ActiveWorkbook)を取得する。でも、それがデスクトップ上で最前面かどうかは分からない。なので、それらの Process ID を GetWindowThreadProcessId() と比べる。って思ったんだけど、PowerPoint の VBA は弄ったことないんですが、ActivePowerPoint みたいのない? # これ、最終的に出来上がるモノって、イタズラ目的じゃないよね?

lhouse
質問者

補足

ActiveDocumentの手段はAddInで行う手段ですよね? それとも、既に起動しているファイルを アプリケーションから取得出来るのでしょうか? AddInは最終手段として、とりあえず アプリからコントロールしたいのです。 それと、当然のことながら、イタズラ目的ではないです。 仕事なんです。。。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.5

ROT に列挙されてるオブジェクトの IUnknown を CoGetServerPID(goolge で探すと見つかります)した Process ID と GetWindowThreadProcessId() を比べるのはどうですか?

参考URL:
http://www.google.co.jp/search?q=CoGetServerPID
lhouse
質問者

補足

PowerPointは1プロセスでのみ起動されるので、 プロセス単位に個々のファイル判別が出来ないため、 その方法での判別は難しいです

  • jmh
  • ベストアンサー率23% (71/304)
回答No.4

逆に、Office側にAddInか何かをインストールしちゃうのはダメですか?

lhouse
質問者

補足

AddInなら処理次第で取得できそうですね。 ただし、Office2000~2007までの全バージョンに 対応させなければならないので、 ちょっと現実的ではないかと(時間的に)。。。 どうしてもダメならAddInで試してみることにします。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

> 読み取り専用ファイルも区分なく取得したい > まだ、保存してない場合も? 埋め込まれたオブジェクトを表示してる場合は?(例えば「文書1.doc」に「ワークシート オブジェクト」挿入して、それを「開く」と「Microsoft Excel - 文書1.doc の ワークシート」が最前面ウィンドーになります) IEの中にワークシート(最前面は「C:\a.xls - Windows Internet Explorer」)みたいになることもあります。

lhouse
質問者

補足

返信が遅れてすみません。 まだ保存していない場合も取得したいです。 また、sysinternalのhandle.exeで試してみましたが、 1プロセスに複数ファイル存在する場合、 複数ファイルが列挙されてしまうため、 どのファイルディレクトリなのか区分できず、 目的を満たすことは出来ませんでした。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

sysinternals の handle に -p を与えるとリストが出るので、これを使うのはどうですか? C:\> handle.exe -p 1095093 -a | findstr /i xls 50C: File (R--) C:\Book1.xls # でも、読み取り専用のファイルを表示してるときは出ませんでした。

lhouse
質問者

お礼

色々と調べて頂きありがとうございます。 読み取り専用ファイルも区分なく取得したいので 解決とはいかないです。。。 完全パスの取得は諦めるしかないかと考えています。。。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.1

irotview.exe みたいにするのは?

lhouse
質問者

補足

具体的な手段が分らないのですが、 running object tableを使用して どうにかするってことなんでしょうか?

関連するQ&A