IEのconfirmやalertで表示されるダイヤログを自動に押したいのですがどうやるかが分からず困っております。
ご存じの方、宜しくお願い致します。
---コーディング内容---
objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate2(strURL)
Set objButton = objIE.Document.getElementById("submit")
objButton.click <- ここでダイヤログが表示されます
<ここで、ダイヤログのボタンを押したい>
申し忘れていました環境はVB.Netです。
お騒がせいたしました。何とか解決です。
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
上記の内容でうまくいったと思ったのですが、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
ツイート | ![]() |