ファイルの検索画面を開くには

解決


masa  2008-09-10 01:55:41  No: 145171

「マイコンピュータ」==>「検索ボタン」==>「ファイルとフォルダのすべて」で開かれるウインドウをVB.NETのコードから開くことはできますか?


魔界の仮面弁士  2008-09-10 03:29:23  No: 145172

手元の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


masa  2008-09-10 18:24:24  No: 145173

魔界の仮面弁士様
提示頂いたコードで開くことができました。
ありがとうございます。
こちらの環境を書かずにすみません。
(VB2008環境(.NET 3.5 + WinXP/SP3))

今の僕には、少し敷居の高い内容ですが、今後の参考のために
以下の2点だけ、よろしければ教えてもらえませんか?

(1)GetObjectの引数(モニカ?)で指定しているCLSIDはどのようにして
      得られるのですか?(レジストリにはありませんでした)

(2)検索画面で初期フォルダを指定することはできますか?
      Navigate2メソッドで初期フォルダを指定せてもダメでした。

      window.Navigate2("C:\hogehoge")
      System.Threading.Thread.Sleep(1000)


魔界の仮面弁士  2008-09-10 22:24:45  No: 145174

> (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


魔界の仮面弁士  2008-09-10 22:27:31  No: 145175

> window.Navigate2(0I)
Navigate2 の呼び出しは不要だと思いますので、
削除しておいてください。m(_ _;)m

# 実験コード時の記述が残ってたようで…。


masa  2008-09-11 00:11:19  No: 145176

ありがとうございます。
初期フォルダの指定もできました。
始めて質問しましたが、僕にとって大変、有意義な内容となりました。
今後共、よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加