C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 開いている全ウインドウのパスを取得する方法


(過去ログ 138 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■81061 / inTopicNo.1)  開いている全ウインドウのパスを取得する方法
  
□投稿者/ ぽぽろーぐ (1回)-(2016/08/27(Sat) 12:47:11)

分類:[.NET 全般] 


VBを使って、Explorerを強制終了させた後に
プログラムを実行し、最後にExplorerを再起動し、
実行前に開いていたウインドウを復元するというプログラムを作りたいのですが

実行前に開いていたウインドウを復元する、というコードをどのように書けば良いか教えてください、

http://dobon.net/vb/dotnet/process/enumwindows.html

このサイトに開いているプロセスのプロセス名やハンドルを取得するコードが書かれているのですが、
ウインドウのパス名を取得する方法は書かれていません。

一度、Explorerを再起動すると、ウインドウのハンドル名も変わりますし
どうすれば良いでしょうか?


引用返信 編集キー/
■81068 / inTopicNo.2)  Re[1]: 開いている全ウインドウのパスを取得する方法
□投稿者/ 魔界の仮面弁士 (846回)-(2016/08/28(Sun) 14:04:14)
No81061 (ぽぽろーぐ さん) に返信
> 実行前に開いていたウインドウを復元する、というコードをどのように書けば良いか教えてください、
起動中の Explorer は ShellWindows コレクションから取得できます。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773974.aspx

'Visual Basic
Dim ShellWindows As Object = GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39")

// C#
dynamic shellWindows = Activator.CreateInstance(Type.GetTypeFromCLSID(Guid.Parse("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")));


上記コレクションを列挙することで、Explorer と Internet Explorer を列挙できます。
各インスタンスが Explorer なのか IE なのかは、FullName プロパティで確認できます。
https://msdn.microsoft.com/en-us/library/aa752053.aspx

(IE5.5 や IE6 あたりだと、IEでフォルダを開いたり、Explorer で Web ページを
 開いたりできましたが、今はそういうこともないので、FullName だけで判断できるはず)


あとは、Left, Top, Width, Height プロパティから座標を拾い、
LocationURL から表示しているパスを拾っていけば、
「現在のウィンドウ」が分かりますので、これを強制終了前に保存しておくと良いでしょう。
https://msdn.microsoft.com/en-us/library/aa752084.aspx


なお、復元に関しては、「ウィンドウの位置」と「表示されるフォルダ」が問題になります。

たとえば、画面構成の変化(画面の縦横変更、マルチモニター環境の変更、
グラフィックボード付きドッキングステーションの挿抜など)によっては
「以前の座標」に復元させると画面外の座標を指してしまうことがあります。

また、リムーバブルドライブやネットワークドライブなどを開いていた場合、
再開時にはそのパスが使用できなっている可能性もありますので、そうした場合に
どのように振る舞うのかも考えておく必要があるでしょう。



蛇足ですが、表示設定(並べて表示、アイコン、詳細など)についても復元するなら、
Shell32.ShellFolderView オブジェクトの CurrentViewMode プロパティもしくは
IFolderView インターフェイスの SetCurrentViewMode メソッドを利用できます。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb775618.aspx
引用返信 編集キー/
■81069 / inTopicNo.3)  Re[2]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (3回)-(2016/08/28(Sun) 14:27:07)
ありがとうございます。
早速試してみました。
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=333&no=0

このサイトも参考にして、
Dim oSW As Object = GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39")
For Each oWB In oSW

Next

のコードを実行し、oSWの中身をローカルウインドウで確認してみましたが、
「エラー」となっており、中身が表示されません。
何が原因でしょうか?
 
引用返信 編集キー/
■81072 / inTopicNo.4)  Re[3]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (5回)-(2016/08/28(Sun) 17:12:56)
すいません、既にご回答が
魔界の仮面弁士さんの回答に書かれてありました。
 
引用返信 編集キー/
■81073 / inTopicNo.5)  Re[4]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (7回)-(2016/08/28(Sun) 17:29:31)
あと、ちなみにUniversal Naming Convention (UNC) formatのパスをフォルダーを開いて
LeftやTopなどのウインドウの位置を反映させるにはどうしたら良いですか?
http://www.majishini.net/wp/?p=412
VB6だと
SetCurrentDirectoryWで開けるそうなのですが
VB.NETだとIntPtrが使えないので
ファイルパスをハンドルに変換できないのですが
 
引用返信 編集キー/
■81074 / inTopicNo.6)  Re[5]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (8回)-(2016/08/28(Sun) 17:49:12)
http://dobon.net/vb/dotnet/file/uritofilepath.html

UNCから通常のパスへの変換の仕方は分かりました。
しかし、エクスプローラーでのウインドウ位置の設定の仕方が分かりません
http://dobon.net/vb/dotnet/process/movewindow.html
ここにそれらしい解説があったのですが
どうもエクスプローラーには使えませんでした。
 
引用返信 編集キー/
■81075 / inTopicNo.7)  Re[6]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (10回)-(2016/08/28(Sun) 18:19:47)
エクスプローラーを再起動後に
再度ShellWindows コレクションを使えばウインドウ位置の再設定もできますね
しかし、一つ一つ検索してパス名を探さないといけないのでスマートでないのですが
できればウインドウを開くと同時にハンドルも取得することはできないでしょうか?
 
引用返信 編集キー/
■81080 / inTopicNo.8)  Re[5]: 開いている全ウインドウのパスを取得する方法
□投稿者/ 魔界の仮面弁士 (847回)-(2016/08/28(Sun) 23:32:41)
No81073 (ぽぽろーぐ さん) に返信
> SetCurrentDirectoryWで開けるそうなのですが
それは、自プロセスに対するカレントディレクトリを設定するだけで、
今回の話とは無関係なのでは?


> あと、ちなみにUniversal Naming Convention (UNC) formatのパスをフォルダーを開いて
(案1) Shell オブジェクトの Explore メソッドで開く。
https://msdn.microsoft.com/en-us/library/bb774073.aspx

(案2) IWebBrowser インターフェイスの Navigate2 メソッドで開く。
https://msdn.microsoft.com/en-us/library/aa752094.aspx

(案3) Explorer.exe のコマンドラインオプションで開く。
https://support.microsoft.com/ja-jp/kb/152457


> LeftやTopなどのウインドウの位置を反映させるにはどうしたら良いですか?
質問の意図が良くわかりませんが、そのままの座標では都合が悪いのなら、
Left や Top に任意の座標を指定しましょう。

> VB.NETだとIntPtrが使えないので
Dim p As IntPtr という宣言はできますが、どういう意味でしょうか?

> ファイルパスをハンドルに変換できないのですが
ファイルパスを、何のハンドルに変換したいのでしょうか?
引用返信 編集キー/
■81081 / inTopicNo.9)  Re[6]: 開いている全ウインドウのパスを取得する方法
□投稿者/ 魔界の仮面弁士 (848回)-(2016/08/28(Sun) 23:35:54)
No81074 (ぽぽろーぐ さん) に返信
> http://dobon.net/vb/dotnet/file/uritofilepath.html
> UNCから通常のパスへの変換の仕方は分かりました。
UNC が通常のパスではない、という事でしょうか。どういう意味が良くわかりませんが、
その URL に書かれている内容は、UNC ではなく URI からの変換だと思います。

> しかし、エクスプローラーでのウインドウ位置の設定の仕方が分かりません
> http://dobon.net/vb/dotnet/process/movewindow.html
API を使うまでもなく、.Left と .Top を設定するだけで良いのでは?
引用返信 編集キー/
■81082 / inTopicNo.10)  Re[6]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (12回)-(2016/08/28(Sun) 23:39:14)
すいません、質問内容をまとめます

1.ShellWindowsで全ウインドウのパスとウインドウ位置を変数に保存する
2.Explorerを終了する
3.プログラムを実行する
4.Explorerを起動する
5.最初に保存したパス名を使って元開いていたフォルダーを開く
それと同時にウインドウ位置を設定したいのですが
フォルダーを開くとともにその開いたフォルダーのハンドル名を取得するにはどうしたら良いですか?
 
引用返信 編集キー/
■81083 / inTopicNo.11)  Re[1]: 開いている全ウインドウのパスを取得する方法
□投稿者/ Azulean (695回)-(2016/08/29(Mon) 00:27:25)
No81061 (ぽぽろーぐ さん) に返信
> VBを使って、Explorerを強制終了させた後に
> プログラムを実行し、最後にExplorerを再起動し、
> 実行前に開いていたウインドウを復元するというプログラムを作りたいのですが

このアプローチに至った経緯が気になります。

このアプローチは、何らかの理由があって、Explorer を強制終了させるということなのだと思いますが、どう頑張っても完全な回復はできません。
一例としては、エクスプローラーにサードパーティ製アプリを使ってタブ拡張している場合、そのタブの復元は不可能なレベルです。

万人向けならば、そもそも、復元できないシーンがあるので Explorer を強制終了させて復帰するというアプローチの見直しを考えた方が良いと思います。
逆に、特定の組織内に展開するケースなどは、Explorer の状態回復はあきらめてもよさそうですが…。

ということを考え始めたとき、「Explorer を強制終了しなければならない」という当初の命題の見直しを考えた方が良いのではと思った次第です。
引用返信 編集キー/
■81084 / inTopicNo.12)  Re[2]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (14回)-(2016/08/29(Mon) 00:43:58)
Explorer が使用しているキャッシュファイルを削除するために
Explorer を強制終了する必要があるためです。
指定したファイルを一時的にExplorer からの使用を解除する方法があれば教えてください

また、タブ拡張はしていないし、私しか使用しないので問題ありません。
 
引用返信 編集キー/
■81085 / inTopicNo.13)  Re[7]: 開いている全ウインドウのパスを取得する方法
□投稿者/ Azulean (696回)-(2016/08/29(Mon) 00:55:38)
2016/08/29(Mon) 01:08:42 編集(投稿者)

No81084 (ぽぽろーぐ さん) に返信
> また、タブ拡張はしていないし、私しか使用しないので問題ありません。

了解です。
 

No81082 (ぽぽろーぐ さん) に返信
> フォルダーを開くとともにその開いたフォルダーのハンドル名を取得するにはどうしたら良いですか?


Explorer は特殊な作りをしているので、Explorer 起動で即、ウィンドウハンドルを得るのは難しそうな気がします。
新しいウィンドウを開きつつ、COM オブジェクトを手に入れるインターフェースがあればできるかもしれませんが。
(未調査。少なくとも、Process.Start や Shell 関数などでは無理だと予想します)

ウィンドウ位置を変えることだけが目的だったのであれば、魔界の仮面弁士さんがすでに何度か書いているように、Explorer 復元後に ShellWindows を再度列挙して、パスを識別し、そのオブジェクトの Left と Top で調整すれば良いと言うことになります。
https://msdn.microsoft.com/en-us/library/aa752056
https://msdn.microsoft.com/en-us/library/aa768275

1手間かかって面倒かもしれませんが、すでに出ている情報で作れますね。
(Dictionary でパスと座標(Point)のペアで管理し、ShellWindow の For ループ内で Dictonary のキーとして「パス」を渡して、座標を取り出して設定する処理なら、そんなに手間ではないと考えていました)

それ以外にハンドルが欲しい理由があるのであれば、やりたいことを書いてもらった方が良いかと思います。
引用返信 編集キー/
■81092 / inTopicNo.14)  Re[3]: 開いている全ウインドウのパスを取得する方法
□投稿者/ とっちゃん (399回)-(2016/08/29(Mon) 11:56:51)
No81084 (ぽぽろーぐ さん) に返信
> Explorer が使用しているキャッシュファイルを削除するために
> Explorer を強制終了する必要があるためです。
> 指定したファイルを一時的にExplorer からの使用を解除する方法があれば教えてください
>
エクスプローラの使用しているキャッシュファイルが何かわかりませんが
ファイルによっては、SHChangeNotify API でキャッシュファイルの解放ができる場合もあります。

あと、エクスプローラの強制終了ですが、プロセスを探して落としていくのではなく
リスタートマネージャを使うことをお勧めします。

https://msdn.microsoft.com/en-us/library/cc948910.aspx

ちょっと探してみたところ、C# のコードですが、実際に特定のファイルを参照している
プロセスをRestartManagerを使って終了させるサンプルがあったのでそれも張り付けておきます。

http://8thway.blogspot.jp/2014/05/restartmanager.html

これで、終了した後、キャッシュファイルの削除などを行って
Restart API で再起動させてやれば、面倒な列挙などを考慮することなく
操作できると思いますよ。

引用返信 編集キー/
■81100 / inTopicNo.15)  Re[4]: 開いている全ウインドウのパスを取得する方法
□投稿者/ ぽぽろーぐ (15回)-(2016/08/29(Mon) 19:02:28)
ありがとうございます。
リスタートマネージャを使いたいと考えているのですが
検索して調べてもなぜかVB用のコードが見つかりませんでした。
方法を教えていただけないでしょうか?
 
引用返信 編集キー/
■81166 / inTopicNo.16)  Re[5]: 開いている全ウインドウのパスを取得する方法
□投稿者/ とっちゃん (400回)-(2016/08/31(Wed) 12:05:16)
No81100 (ぽぽろーぐ さん) に返信
> ありがとうございます。
> リスタートマネージャを使いたいと考えているのですが
> 検索して調べてもなぜかVB用のコードが見つかりませんでした。
> 方法を教えていただけないでしょうか?
>  
C#のコードはわからないので。。。ということでしょうか?
それとも、RestartManagerの使い方そのものがわからないので。。。ということでしょうか?

前者なら、別スレッドですが「B.Netで (aaa == 1) ? 1 : 0 の記述」でPANG2さんが紹介している

C#/VB.NET コード変換サイト
Snippet Converter
http://codeconverter.sharpdevelop.net/SnippetConverter.aspx

が利用できると思います。

後者であれば、まずはリファレンスを読むところからですかね。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -