「マイコンピュータ」==>「検索ボタン」==>「ファイルとフォルダのすべて」で開かれるウインドウをVB.NETのコードから開くことはできますか?
手元のVB2005環境(.NET 2.0/SP1 + WinXP/SP3) では、
下記のコードで開けました。
Imports System.Runtime.InteropServices
Imports System.Runtime.InteropServices.Marshal
Module Module1
Sub Main()
Dim window As Object = Nothing
Dim band As IFileSearchBand = Nothing
Try
window = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
window.Navigate2(0I)
window.Visible = True
window.ShowBrowserBar("{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}", True)
band = window.GetProperty("{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}")
band.SetSearchParameters(band.SearchID, True, Nothing, "C:\")
Catch ex As Exception
Console.WriteLine(ex.Message)
MsgBox(ex.Message)
Finally
If band IsNot Nothing AndAlso IsComObject(band) Then ReleaseComObject(band)
If window IsNot Nothing AndAlso IsComObject(window) Then ReleaseComObject(window)
End Try
End Sub
End Module
<Guid("2D91EEA1-9932-11D2-BE86-00A0C9A83DA1")> _
Public Interface IFileSearchBand
<DispId(1)> Sub SetFocus()
<DispId(2)> Sub SetSearchParameters( _
<MarshalAs(UnmanagedType.BStr)> ByRef pbstrSearchID As String, _
<MarshalAs(UnmanagedType.VariantBool)> ByVal bNavToResults As Boolean, _
<MarshalAs(UnmanagedType.Struct)> Optional ByRef pvarScope As Object = Nothing, _
<MarshalAs(UnmanagedType.Struct)> Optional ByRef pvarQueryFile As Object = Nothing)
<DispId(3)> Function SearchID() As String
<DispId(4)> Function Scope() As Object
<DispId(5)> Function QueryFile() As Object
End Interface
魔界の仮面弁士様
提示頂いたコードで開くことができました。
ありがとうございます。
こちらの環境を書かずにすみません。
(VB2008環境(.NET 3.5 + WinXP/SP3))
今の僕には、少し敷居の高い内容ですが、今後の参考のために
以下の2点だけ、よろしければ教えてもらえませんか?
(1)GetObjectの引数(モニカ?)で指定しているCLSIDはどのようにして
得られるのですか?(レジストリにはありませんでした)
(2)検索画面で初期フォルダを指定することはできますか?
Navigate2メソッドで初期フォルダを指定せてもダメでした。
window.Navigate2("C:\hogehoge")
System.Threading.Thread.Sleep(1000)
> (1)GetObjectの引数(モニカ?)で指定しているCLSIDはどのようにして
coclass ShellBrowserWindow の UUID 値です。
ShellBrowserWindow の uuid は、ExDisp.h / exdisp.idl / shdocvw.dll などで
調べる事ができます。
> (2)検索画面で初期フォルダを指定することはできますか?
当方では、こんな感じで指定できました。
Imports System.Runtime.InteropServices
Imports System.Runtime.InteropServices.Marshal
Module Module1
Sub Main()
Dim window As Object = Nothing
Dim band As IFileSearchBand = Nothing
Dim shellObj As Object = Nothing
Dim folder As Object = Nothing
Try
window = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
window.Navigate2(2I)
window.Visible = True
window.ShowBrowserBar("{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}", True)
band = window.GetProperty("{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}")
shellObj = CreateObject("Shell.Application")
folder = shellObj.Namespace("C:\Program Files\Microsoft Office")
band.SetSearchParameters(band.SearchID, True, folder, Nothing)
Catch ex As Exception
Console.WriteLine(ex.Message)
MsgBox(ex.Message)
Finally
If folder IsNot Nothing AndAlso IsComObject(folder) Then ReleaseComObject(folder)
If shellObj IsNot Nothing AndAlso IsComObject(shellObj) Then ReleaseComObject(shellObj)
If band IsNot Nothing AndAlso IsComObject(band) Then ReleaseComObject(band)
If window IsNot Nothing AndAlso IsComObject(window) Then ReleaseComObject(window)
End Try
End Sub
End Module
<Guid("2D91EEA1-9932-11D2-BE86-00A0C9A83DA1")> _
Public Interface IFileSearchBand
<DispId(1)> Sub SetFocus()
<DispId(2)> Sub SetSearchParameters( _
<MarshalAs(UnmanagedType.BStr)> ByRef pbstrSearchID As String, _
<MarshalAs(UnmanagedType.VariantBool)> ByVal bNavToResults As Boolean, _
<MarshalAs(UnmanagedType.Struct), [In]> Optional ByRef pvarScope As Object = Nothing, _
<MarshalAs(UnmanagedType.Struct), [In]> Optional ByRef pvarQueryFile As Object = Nothing)
<DispId(3)> ReadOnly Property SearchID() As String
<DispId(4)> ReadOnly Property Scope() As Object
<DispId(5)> ReadOnly Property QueryFile() As Object
End Interface
> window.Navigate2(0I)
Navigate2 の呼び出しは不要だと思いますので、
削除しておいてください。m(_ _;)m
# 実験コード時の記述が残ってたようで…。
ありがとうございます。
初期フォルダの指定もできました。
始めて質問しましたが、僕にとって大変、有意義な内容となりました。
今後共、よろしくお願いします。
ツイート | ![]() |