2015年1月5日月曜日

ダイアログ等のボタンを押す処理

Webページをスクレイピングする際に問題になるダイアログ処理をVBでやるためにいろいろ調べた結果、どうにかこうにか動くようになった。
いろんなページから参考を探して丸写しだけでは結構動かない。何が違うのかは分からないがおそらくフォーカスとかだろう。

・凄く参考にしたサイト
http://happylife.miraiserver.com/wp/net-%E3%81%A7%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%82%92%E4%BD%95%E3%81%A8%E3%81%8B%E3%81%99%E3%82%8B-1215.html

    'ダイアログ処理用サブスレッド
    Private Sub start_dialog()
        Dim t As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf watch_dialog))
        t.Start()
    End Sub
    Private Sub watch_dialog()
        Dim hwnd As Integer
        Dim hwnd2 As Integer
        Do
            'ファイルダウンロード確認ダイアログの処理
            System.Threading.Thread.Sleep(500)
            hwnd = FindWindow("#32770", "ファイルのダウンロード")
            If (hwnd <> 0) Then
                hwnd = FindWindow("#32770", "ファイルのダウンロード")
                hwnd2 = FindWindowEx(hwnd, 0, "Button", "保存(&S)")
                If (hwnd <> 0 And hwnd2 <> 0) Then
                    Call SendMessage(hwnd2, WM_ACTIVATE, 1, 0)
                    System.Threading.Thread.Sleep(500)
                    Call SendMessage(hwnd2, BM_CLICK, 0, 0)
                End If
            End If

            'ファイル保存先指定ダイアログの処理
            System.Threading.Thread.Sleep(500)
            hwnd = FindWindow("#32770", "名前を付けて保存")
            If (hwnd <> 0) Then
                hwnd2 = FindWindowEx(hwnd, 0, "Button", "保存(&S)")
                If (hwnd2 <> 0) Then
                    Call SendMessage(hwnd2, WM_ACTIVATE, 1, 0)
                    System.Threading.Thread.Sleep(600)
                    Call SendMessage(hwnd2, BM_CLICK, 0, 0)
                End If
            End If

            'ダウンロード完了ダイアログの処理
            hwnd = FindWindow("#32770", "ダウンロードの完了")
            If (hwnd <> 0) Then
                hwnd = FindWindow("#32770", "ダウンロードの完了")
                hwnd2 = FindWindowEx(hwnd, 0, "Button", "閉じる")
                If (hwnd <> 0 And hwnd2 <> 0) Then
                    Call SendMessage(hwnd2, WM_ACTIVATE, 1, 0)
                    System.Threading.Thread.Sleep(600)
                    Call SendMessage(hwnd2, BM_CLICK, 0, 0)
                End If
            End If
        Loop
    End Sub

0 件のコメント:

コメントを投稿