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

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

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

エクスプローラーでファイルを選択状態にする方法

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

■95803 / inTopicNo.1)  エクスプローラーでファイルを選択状態にする方法
  
□投稿者/ bibo (1回)-(2020/09/26(Sat) 14:29:04)

分類:[.NET 全般] 



VB2015を使用しております。

ファイルを選択状態で、フォルダーを開くためには

Call Shell("explorer.exe /select," & Text1.Text, vbNormalFocus)

で実行することができます。

一方で、既にフォルダーがエクスプローラーで開かれており、
そのウインドウの中でファイルを選択状態にするにはどのようにすれば良いですか?

どのAPIを使えば良いですか??


引用返信 編集キー/
■95804 / inTopicNo.2)  Re[1]: エクスプローラーでファイルを選択状態にする方法
□投稿者/ Hongliang (1092回)-(2020/09/26(Sat) 19:46:45)
考えることが増えるので単純ではないですが。

参照の追加でCOM参照からMicrosoft Shell Controls And Automationを追加しておきます。

Option Infer On
Option Strict Off ' 一部で遅延バインディングするのでOnにできない

Shared Sub SelectFolderItem(ByVal folderPath As String, ByVal name As String)
    Dim shell = New Shell32.Shell()
    Dim wins = shell.Windows()
    For Each win In wins
        ' IEも列挙されるのでExplorerかどうかの判定
        If Not (win.FullName).ToUpper().EndsWith("EXPLORER.EXE") Then
            Continue For
        End If
        Dim folderView = DirectCast(win.Document, Shell32.ShellFolderView)
        Dim folder = folderView.Folder
        Dim folderItem = DirectCast(folder.Self, Shell32.FolderItem)
        If folderItem.Path.ToUpper() = folderPath.ToUpper() Then
            Dim objFolderItem As Object = Nothing
            Dim items = folder.Items()
            For Each item As Shell32.FolderItem In items
                If (item.Name = name) Then
                    objFolderItem = item
                    Exit For
                End If
            Next
            If objFolderItem IsNot Nothing Then
                Const SelectItem As Integer = 1
                Const DelesectOthers As Integer = 4
                Const ScrollIntoView As Integer = 8
                folderView.SelectItem(objFolderItem, SelectItem Or DeselectOthers Or ScrollIntoView)
                Exit For
            End If
        End If
    Next
End Sub

考慮すべき点としては、以下のようなところでしょうか。
・複数のウィンドウが同じフォルダを開いている場合どうするか?
・操作したい対象が「ライブラリ」など実在のフォルダではない場合に対応するか?
// シンボリックリンクとか考えだすとキリがないですが。

引用返信 編集キー/
■95805 / inTopicNo.3)  Re[1]: エクスプローラーでファイルを選択状態にする方法
□投稿者/ 魔界の仮面弁士 (2844回)-(2020/09/26(Sat) 19:55:26)
No95803 (bibo さん) に返信
> 一方で、既にフォルダーがエクスプローラーで開かれており、
> そのウインドウの中でファイルを選択状態にするにはどのようにすれば良いですか?

エクスプローラーが複数開かれていた場合、どのエクスプローラーを操作するのでしょうか?
同じフォルダーが複数のウィンドウで開かれている可能性もありますし、
その逆に、フォルダー ウィンドウが一つも開かれていない可能性だってあるでしょう。

また、該当のフォルダー内にある複数のアイテムのうち、
どのファイルとどのファイルを選択状態にするのでしょうか? すべてですか?
選択状態にするのはファイルだけで、フォルダーは選択しないのでしょうか?



> どのAPIを使えば良いですか??

1) ShellWindows オブジェクトを列挙して、起動中のエクスプローラーを取得する。

2) その Document プロパティから ShellFolderView オブジェクトを取得して、開いているフォルダーを得る。

3) その SelectItem メソッドもしくは SelectItemRelative メソッドで必要なファイルを選択状態にする。

https://docs.microsoft.com/ja-jp/windows/win32/shell/shellfolderview-selectitem
引用返信 編集キー/
■95806 / inTopicNo.4)  Re[2]: エクスプローラーでファイルを選択状態にする方法
□投稿者/ bibo (2回)-(2020/09/26(Sat) 20:51:48)
ありがとうございます。


お二方の方法でうまくいきました。

ちなみに、
Hongliangさんは、Shell32.Shell()のshell.Windows()
魔界の仮面弁士さんは、ShellWindows

をつかってらっしゃいますが、
これらは全く同じものなのでしょうか?

違いなどありましたらお教え願いますでしょうか?

引用返信 編集キー/
■95808 / inTopicNo.5)  Re[3]: エクスプローラーでファイルを選択状態にする方法
□投稿者/ 魔界の仮面弁士 (2846回)-(2020/09/26(Sat) 23:02:00)
No95804 (Hongliang さん) に返信
> 参照の追加でCOM参照からMicrosoft Shell Controls And Automationを追加しておきます。

出遅れちゃいました。(^^;


> Option Strict Off ' 一部で遅延バインディングするのでOnにできない
Option Strict On なバージョンも書いてみました。

https://gist.github.com/Benshi/244c0a35ecdd69281ec753c8f21dd87e

元質問にない余計な処理も加えているので、
その分、コードが冗長になっています。


No95806 (bibo さん) に返信
> Hongliangさんは、Shell32.Shell()のshell.Windows()
> 魔界の仮面弁士さんは、ShellWindows

Shell オブジェクトの Windows メソッドは、ShellWindows オブジェクトを返します。
Shell オブジェクトを経由せずに、ShellWindows を直接生成しても構いません。

https://docs.microsoft.com/ja-jp/windows/win32/shell/shell-windows
https://docs.microsoft.com/ja-jp/windows/win32/shell/shellwindows
引用返信 編集キー/
■95809 / inTopicNo.6)  Re[4]: エクスプローラーでファイルを選択状態にする方法
□投稿者/ bibo (3回)-(2020/09/27(Sun) 10:15:40)
No95808 (魔界の仮面弁士 さん) に返信

ありがとうございます。

提示くださったOption Strict Onの方も使用したいのですが、
コードが複雑で追えていません。

遅延バインディングのエラーは

Dim folderItem As Shell32.FolderItem = DirectCast(folder.Self, Shell32.FolderItem)


の部分だけで出ているのですが、
ここだけエラーが出ないようにするにはどうしたら良いですか?

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ