IEのconfirmやalertで表示されるダイヤログをVBで押すには?

解決


あさくら  2003-12-22 03:23:52  No: 81070

IEのconfirmやalertで表示されるダイヤログを自動に押したいのですがどうやるかが分からず困っております。
ご存じの方、宜しくお願い致します。

---コーディング内容---
objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate2(strURL)
Set objButton = objIE.Document.getElementById("submit")
objButton.click  <- ここでダイヤログが表示されます
<ここで、ダイヤログのボタンを押したい>


あさくら  2003-12-22 03:27:43  No: 81071

申し忘れていました環境はVB.Netです。


あさくら  2003-12-23 11:50:32  No: 81072

お騒がせいたしました。何とか解決です。
APIを使って実現できました。
以下に、コーディング内容を記述します。

Public Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" (ByVal lpClassName As String, _
                       ByVal lpWindowName As String) As Integer

Public Declare Function FindWindowEx Lib "user32" _
  Alias "FindWindowExA" (ByVal hWnd1 As Integer, _
                         ByVal hWnd2 As Integer, _
                         ByVal lpsz1 As String, _
                         ByVal lpsz2 As String) As Integer

Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" (ByVal hwnd As Integer, _
                        ByVal wMsg As Integer, _
                        ByVal wParam As Integer, _
                        ByVal lParam As Integer) As Integer

Private Sub btnDialog_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnDialog.Click

   Const WM_SETFOCUS = &H7
   Const WM_LBUTTONDOWN = &H201
   Const WM_LBUTTONUP = &H202
   Dim objIE As Object
   Dim ojbButton As Object
   Dim strURL As String
   Dim hWnd1 As Long
   Dim hWnd2 As Long

   objIE = CreateObject("InternetExplorer.Application")
   objIE.Navigate2(strURL)
   objButton = objIE.Document.getElementById("submit")
   objButton.click

   hWnd1 = FindWindow("#32770", "Microsoft Internet Explorer")
   If hWnd1 <> 0 Then
       hWnd2 = FindWindowEx(hWnd1, 0, "Button", "OK")
       If hWnd2 <> 0 Then
           SendMessage(hWnd1, WM_SETFOCUS, &H0, &H0)
           SendMessage(hWnd2, WM_LBUTTONDOWN, &H1, &H70029)
           SendMessage(hWnd2, WM_LBUTTONUP, &H0, &H70029)
       End If
   End If

End Subf


あさくら  2003-12-23 13:22:24  No: 81073

上記の内容でうまくいったと思ったのですが、objbutton.clickを実行したときダイヤログのボタンが押されるまで処理がストップされ、次のステップへ進みません。
そこで以下のように修正してやってみたところ、うまく行きました。
Clickでダイヤログが表示され処理がストップしますが、別スレッドでダイヤログを監視するように改善しました。
スレッドの代わりにタイマー処理もやってみましたが、ダイヤログが表示されている間は、タイマーの割り込みがされませんでした。
VB.NET限定かな。

Public Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" (ByVal lpClassName As String, _
                       ByVal lpWindowName As String) As Integer

Public Declare Function FindWindowEx Lib "user32" _
  Alias "FindWindowExA" (ByVal hWnd1 As Integer, _
                         ByVal hWnd2 As Integer, _
                         ByVal lpsz1 As String, _
                         ByVal lpsz2 As String) As Integer

Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" (ByVal hwnd As Integer, _
                        ByVal wMsg As Integer, _
                        ByVal wParam As Integer, _
                        ByVal lParam As Integer) As Integer

Private Sub btnDialog_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnDialog.Click

    Dim objIE As Object
    Dim objButton As Object
    Dim strURL As String
    Dim ThreadID As System.Threading.Thread

    objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate2(strURL)
    objButton = objIE.Document.getElementById("submit")
    ThreadID = New System.Threading.Thread _
                 (AddressOf Me.DialogWatchTask)
    ThreadID.Start()
    objButton.click  <-本来ならここでダイヤログが表示され処理がストップ
    ThreadID.Abort()

End Sub

Public Sub DialogWatchTask()  <-別スレッドで監視
    Const WM_SETFOCUS = &H7
    Const WM_LBUTTONDOWN = &H201
    Const WM_LBUTTONUP = &H202
    Dim hWnd1 As Long
    Dim hWnd2 As Long

    Do
        hWnd1 = FindWindow("#32770", "Microsoft Internet Explorer")
        If hWnd1 <> 0 Then
            hWnd2 = FindWindowEx(hWnd1, 0, "Button", "OK")
            If hWnd2 <> 0 Then
                SendMessage(hWnd1, WM_SETFOCUS, &H0, &H0)
                SendMessage(hWnd2, WM_LBUTTONDOWN, &H1, &H70029)
                SendMessage(hWnd2, WM_LBUTTONUP, &H0, &H70029)
                Exit Do
            End If
        End If
    Loop

End Sub


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

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






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