msgboxで処理が止まらないようにするには?(WebBrowser)

解決


GOMA  2004-03-05 04:51:55  No: 82419  IP: [192.*.*.*]

いつも参考にさせて頂いてます。
書き込みは今回初めてです。
もし不適な表現がありましたら、ご指摘ください。

開発環境:Windows2000(SP4)
開発言語:VB6.0(SP5)          
ブラウザ:IE5.5

今、上記の環境でブラウザ(HTML)に対する操作の記録&再生プログラムに挑戦しています。

'Webブラウザオブジェクト(イベント取得の為WithEvents)
Public WithEvents objWeb As SHDocVw.WebBrowser

'CreateObject
Set objWeb = CreateObject("InternetExplorer.Application")

とし、各イベントを拾う事で操作をスクリプトファイルとして出力し、
そのスクリプトをもとに操作を再現するというものです。

操作を記録し、再生する事は概ね成功しました。

が、ここでひとつ問題が発生したのです。
例えばINPUTエレメント(TYPE=BUTTON)の押下を再生した際、
そのボタンのonclickイベント内にmsgboxなどの処理がある場合、
そこで再生が止まってしまいます。
(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。

どうにかこのmsgboxに束縛されず次のSTEPへ進める手段はないものでしょうか?
若しくはその他の回避策があれば良いのですが、、、。
又、記録対象となるWebページは不定であり、こちらでいじる事は原則出来ません。

ご助言、宜しくお願い致します。

編集    削除
マフユ  2004-03-05 05:06:53  No: 82420  IP: [192.*.*.*]

下記は他の掲示板(つい先日閉鎖された)に投稿された内容です。
希望にそうものかどうかは分かりませんが。
元投稿者はここの掲示板でも何時も的確なフォローを書いて
下っている方です。  (無断引用で済みません)


 ret = CreateObject("WScript.Shell").Popup("5秒後に消えます", 5, "タイトル", vbInformation Or vbYesNoCancel Or vbDefaultButton3)
If ret = -1 Then
    'タイムアウト
ElseIf ret = vbYes Then
    '[はい]
End If

編集    削除
IMA  2004-03-05 06:35:41  No: 82421  IP: [192.*.*.*]

>が、ここでひとつ問題が発生したのです。
>例えばINPUTエレメント(TYPE=BUTTON)の押下を再生した際、
>そのボタンのonclickイベント内にmsgboxなどの処理がある場合、
>そこで再生が止まってしまいます。
>(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
>表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
>VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。

msgboxはIEのイベントで出るものですよね?
そうするとVB側から勝手にWSHのものに置き換えることは無理そうな気がしますが?

私が思いつくのは参考リンクのような、msgboxのハンドルを監視する方法ですが
もっとうまい方法があるかもしれません。

識者の皆様フォローお願いします!

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_10926102.html

編集    削除
GOMA  2004-03-06 08:58:44  No: 82422  IP: [192.*.*.*]

>マフユさん
素早い書き込みありがとうございます。
でも、今回の話はWEBコンテンツ内のSCRIPT等で出るメッセージボックスが
問題なので、教えて頂いた方法では解決できないのです。
でもこれはこれで今後役に立ちそうなのでメモさせて頂きます。
また何かあったら是非お願いします。

>IMAさん
おお、こんな海外サイトも活用しているのですか〜。
英語に苦戦しながら読んでみたのですが、
監視用のEXEを別に作成し、立ち上げておく形になるということでよいのでしょうか。
今は直ぐに試せない状況なので次週、試してみます。(まず理解しなくてはですが)
ただ、諸々の事情で極力ひとつのEXEで賄いたいところなのです。

お二方、どうも情報ありがとうございます。
又、今回のようなVBでWebの操作を行うのに参考になるおすすめのHPなどもあったら、教えて下さいね。
今回の件はVBだと難しいような気もしますが、VB使いとしては意地でもどうにかしてみたい!というところです。

編集    削除
IMA  2004-03-06 16:07:09  No: 82423  IP: [192.*.*.*]

GOMA こんにちは

上記の件ですが、私は以下の記載からIEの再生?はVBが実行していると考えました。
したがって、監視用のEXEを別に作成しなくても、上記のVB作成のEXEへ記載すれば
良いのではと考えました。

>(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
>表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
>VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。

なお、例えばIEのMsgBoxがPopUpしたのを即閉じさせたいのなら、ShowChanges(h As Long)
の後の方に

'***!!! Change to your form and textbox name !!!***
   Form1.Text1 = Form1.Text1 & s
>   '取得したウインドウハンドルに終了要求のメッセージを送る
>   Form1.Text1 = Form1.Text1 & vbCrLf & "PostMessage to MsgBox ""WM_QUIT""" & vbCrLf
>   Call PostMessage(h, WM_QUIT, 0, 0)

などと記載すればよいでしょう。(PostMessage、WM_QUIT の宣言もお忘れなく)

MsgBox の内容によって異なる処理をしたいのであれば、Captionその他を解析して
処理を分岐させることになると思います。

編集    削除
GOMA  2004-03-10 02:57:20  No: 82424  IP: [192.*.*.*]

返事遅くなってすみません。
ソースいじってたらいつのまにか動かなくなって、
現在復旧中です。(^^;
まだ断言はできませんが、なんとかいけそうな雰囲気です。
おふたかた、どうもありがとうございました!

編集    削除
GOMA  2004-12-07 03:10:06  No: 82425  IP: [192.*.*.*]

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200412/04120024.txt
>りんさん
こちらの方へ追加発言すれば確か最上段へ上がるので、新規作成せずとも
良いですよ。

すみません、最終的な結果を報告すべきでした。
結論から言うと、自分の力量ではVBのみで解決はできませんでした。

結局どうしたかというと、VC++6.0で作成したWindowMessage監視exeを別途
用意し、操作記録時にブラウザのドキュメント以外の操作(今回のダイアログ等)
はそちらで記録しておき、最後にVBで記録したDOMによる記録とマージさせる、
としました。
再生時は同じくVC++6.0で作成したブラウザDocument以外の操作担当exeを用意し、
IEからダイアログが作成された場合それを検知し、記録時と同様のボタンを押下
させる、という流れです。

尚このVC++部分はそちらに詳しい別の人間が作成担当し、私はあまり詳しくは
ありません。

ここを見ている方でVBで解決できる方法がわかる方おりましたら、フォローを
宜しくお願い致します。

お役に立てずにすみません、、。

編集    削除
IMA  2004-12-07 16:53:42  No: 82426  IP: [192.*.*.*]

GOMAさん  お久しぶりです。りんさん  こんにちは

最初の質問の意味をとらえ違いしていたのかも知れませんが、私の使用する場面は
以下のような場合に用いています。
概要:
1.アクティブなIEを常に監視し、そのLocationUrlによりコンテキストメニューを
独自のものに置き換える。
2.その中に「選択範囲を翻訳」を言う機能があり、選択部分を外部の翻訳ソフトに
渡し、自動的に翻訳させる。

ここで私が困ったことは、翻訳ソフトの終了時に保存確認のMsgBoxが必ずPopUpし、
いちいちクリックしないと終了できないことです。( 煩わしい!)
→これを右上の×ボタンで即終了させたかったのです。

それで、以前紹介したサイトのコードでMsgBoxのPopUpを監視し、現れたら即「はい」
や「いいえ」をクリックさせることを考えました。

使い方は、サイトの例そのもの  ですが、

VBのコードの中で
標準モジュールに、紹介サイト中頃の ----Bas module code---- 以下を、適当な名前
(例えばmWatchMsgBox)を付けて保存しておきます。Sub ShowChanges は適当に変更して下さい。
私の場合は、以下のようにしています。

Private Sub ShowChanges(h As Long)
    Dim sTypePopUp As String, sCaptionPopUp As String, sCaptionParent As String
    If FindWindowEx(h, 0, "Edit", "") Then
        sTypePopUp = "InputBox or dialog"
    Else
        sTypePopUp = "MsgBox"
    End If
    sCaptionPopUp = GetWndText(h)
    sCaptionParent = GetWndText(GetParent(h))
    If sTypePopUp = "MsgBox" And InStr(sCaptionPopUp, "MsgBoxのキャプション") Then
        Call PostMessage(h, WM_QUIT, 0, 0)
    End If
End Sub

そして、私のソフトでは
    'txtTranserは翻訳ソフトのFullPath, /t は起動オプション
    rtn = Shell(txtTranser & " /t", vbNormalFocus)  
    SetTimer hWnd, NV_MYEVENT, 50, AddressOf TimerProc
で翻訳ソフトを起動後、タイマー監視しMsgBoxのPopUpされると、
上のShowChangesが呼び出され、MsgBoxにWM_QUITを送っています。

「はい」や「いいえ」をクリックするには、簡単に
        SendKeys "{TAB}", True
        SendKeys "{ENTER}", True
でやっています。

必要無くなれば、適当なところで
    KillTimer hWnd, NV_MYEVENT
を入れておいて下さい。

-----------------------------------------------------------------------------------

MsgBoxのキャプションを判断することで、色々な場合分けも可能かとは思いますが、
サイトの内容を動的に判断し、それまでに行った処理を変更する場合などは、その判断ロジック
が必要で、それをGOMAさん が望んでおられたなら、的はずれな回答でした。  (^_^;)

編集    削除
りん  2004-12-07 20:18:59  No: 82427  IP: [192.*.*.*]

皆様のご意見、大変参考になりました。ひとまず、アドバイスを踏まえてあれやこれやとやってみようと思います。自分の解決方法ができましたら、また載せますね。ありがとうございました。

編集    削除