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