エクスプローラ(フォーカスがあたっているエクスプローラ)から、表示中のパスを取
得したいのですが、何か良い方法はありませんでしょうか。
【試した方法】
(1)IWebBrowser2のget_LocationURLで取得。
→パスは取得できましたが、ネットワーク上の共有フォルダ上で実行すると、期待した
パスが取得できませんでした。
例)
『\\PC1\共有』を表示しているときに実行すると、
『file:///C:/Documents and Settings/hoge/NetHood/共有%20-%20PC1』
という値が返ってきます。
ただ、『\\PC1\共有\フォルダ1』で実行するときは、『file://PC1/共有/フォルダ1』
と期待した値が取得できます。
(2)ウィンドウハンドルを取得し、アドレスバーに表示されている内容を取得。
→ユーザがアドレスバーの値を変更した場合は、変更された値が取得されてしまう。
→NG
(1)についての回避方法、または、(1)以外に方法でフルパスを取得する方法につ
いて、ご存知の方がいましたら、ご教授いただけないでしょうか。
フォルダの参照ダイアログなんかでも同様の仕様のようで
IWebBrowser2でもここのパスを直接取得するのは無理かもしれませんね。
NetHood配下にあるフォルダの中には実際にはtarget.lnkというファイルが入っていて
それがリンク先になっているようです。
リンク先がサイトとかでない場合はこのショートカットをIShellLinkにロードすれば
一応リンク先パスは取れるかもしれません。
get_LocationURL ではなく、
get_LocationName ではどうでしょうか?
すいません、よく読んでいませんでした。
フルパスなら、get_LocationNameでは無理ですね。
IShellViewから、IFolderView、IPersistFolder2とインタフェースを取得していき
IPersistFolder2::GetCurFolderでITEMIDLISTが取得できるので、
IShellFolder::GetDisplayNameOf()でファイル名やパス名が取得できます。
昔同じ内容のことをやりましたが、
エクスプローラでコントロールパネルを見ていた時や、
ZIPフォルダの中を見ていたときなど、
色々な形式でパスが返却されますので、意外と面倒です。
subaruさん、浩二さんありがとうございます。
IShellViewっていうのがあったんですね。
これは行けそう!と思いながら試してみました。
実行結果は、
『C:\Documents and Settings\hoge\NetHood\共有 - PC1』
でした。残念です。
ちなみに、GetDisplayNameOf()の引数が以下の場合を試しています。
SHGDN_NORMAL|SHGDN_FORPARSING
→結果『C:\Documents and Settings\hoge\NetHood\共有 - PC1』
SHGDN_FORADDRESSBAR|SHGDN_FORPARSING]
→結果『C:\Documents and Settings\hoge\NetHood\共有 - PC1』
SHGDN_NORMAL
→結果『共有 - PC1』
SHGDN_FORADDRESSBAR
→結果『共有 - PC1』