投稿者 豆腐  (社会人) 投稿日時 2023/7/9 10:50:46
■環境:Win10、VB2022、WinFormアプリ、.NET Framework 4.7.2

■最終目的
 「UIAutomationを使ってエクスプローラー右上の検索ボックスに値をセットして検索結果を取得する」
ということが最終目的です。

■現状
 現在は以下のコードで、「検索ボックス(SearchEditBox)」の取得まではできていると思っています。
(ValuePatternでSetValueした時、ドロプダウンされる為。失敗する場合もあり、確実性はありません。)
「Inspect」で確認すると、「Hostウインドウ」があり、「SearchTextBox」を取得すればいけるかな?
と思っているのですが、取得方法がわかりません。

■質問
 最終目的を達成するには、どうすればいいですか?

Imports System.Runtime.InteropServices
Imports System.Windows.Automation
Public Class Form1
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    Private Shared Function FindWindow(
   <MarshalAs(UnmanagedType.LPWStr)> ByVal lpClassName As String,
   <MarshalAs(UnmanagedType.LPWStr)> ByVal lpWindowName As StringAs IntPtr
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim psi As New System.Diagnostics.ProcessStartInfo() With
            {.FileName = "EXPLORER.EXE", .Arguments = "C:\Windows", .WindowStyle = ProcessWindowStyle.Maximized}
        Process.Start(psi)
        Dim hwnd = FindWindow("CabinetWClass""Windows")
        Dim sw As New Stopwatch
        sw.Start()
        Do While hwnd = IntPtr.Zero
            My.Application.DoEvents()
            System.Threading.Thread.Sleep(100)
            hwnd = FindWindow("CabinetWClass""Windows")
            '3秒待ってもウインドウハンドルが取れないなら失敗とする 
            If sw.Elapsed.TotalMilliseconds > 3000 Then
                MessageBox.Show("Time Out!(ハンドル取得失敗)")
                Return
            End If
        Loop
        sw.Stop()
        Dim rootWindow As AutomationElement = AutomationElement.FromHandle(hwnd)
        Dim child = rootWindow?.FindAll(TreeScope.Descendants, Condition.TrueCondition).OfType(Of AutomationElement)
        Dim target = child?.Where(Function(a) a.Current.Name = "SearchEditBox").FirstOrDefault
        Dim patternObject As Object = Nothing
        If target?.TryGetCurrentPattern(ValuePattern.Pattern, patternObject) Then
            Dim p As ValuePattern = DirectCast(patternObject, ValuePattern)
            p.SetValue("test")
        End If
    End Sub
End Class