1

コンポーネントにロードされた Web ページの iFrame 内にロードされた一部の Web ページには、Web ページをWebBrowser閉じるときに確認ウィンドウがポップアップ表示されます。この確認ウィンドウが原因で、メインの Web ページを閉じることができないため、ページを離れるオプションをクリックする必要があります。onbeforeunloadiFrame 内に読み込まれる Web ページのイベントを変更することで、これを回避したいと考えています。

このソリューションを変更して、自分のケースに適用しようとしました。ただし、ソリューションは、その中WebBrowserの iFrame ではなく、その中にロードされたページのイベントにアクセスする場合にのみ適用されるようです。

だからここに私が試したことがあります。

上記のソリューションから最初にインターフェイスを宣言しました。

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00020400-0000-0000-C000-000000000046")]
public interface IDispatch
{
    [PreserveSig]
    int GetTypeInfoCount(out int Count);
    [PreserveSig]
    int GetTypeInfo(
        [MarshalAs(UnmanagedType.U4)] int iTInfo,
        [MarshalAs(UnmanagedType.U4)] int lcid,
        out ITypeInfo typeInfo
    );

    [PreserveSig]
    int GetIDsOfNames(
        ref Guid riid,
        [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
        int cNames,
        int lcid,
        [MarshalAs(UnmanagedType.LPArray)] int[] rgDispId
    );

    [PreserveSig]
    int Invoke(
        int dispIdMember,
        ref Guid riid,
        uint lcid,
        ushort wFlags,
        ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
        out object pVarResult,
        ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
        IntPtr[] pArgErr
    );
}

次に、ポップアップがポップアップしないように、onbeforeunloadイベントを設定するか、何らかの方法でその内容を消去したいと思います。null

HTMLDocument document = (HTMLDocument)webBrowser2.Document.DomDocument;

// iFrame's id is "iF".
HTMLFrameElement frame = (HTMLFrameElement)document.getElementById("iF");
IHTMLWindow2 window = frame.contentWindow;

// Everything works fine until the following line.
var event = (ExtendedWebBrowser.IDispatch)window.onbeforeunload;

// Although no exception is thrown, event variable is always null, no matter if the webpage in the iFrame has or does not have onbeforeunload event specified.
// Setting the event to null does nothing. I'd have to come up with how to read this event before trying to set it to something.
window.onbeforeunload = null;

私の最後の質問は、WebBrowser コントロールにロードされた Web ページの iFrame 内にロードされた Web ページの onbeforeunload イベント (またはその他のイベント) を取得および設定するにはどうすればよいですか?

ご不明な点がございましたら、お気軽にお問い合わせください。前もって感謝します。

編集:

アプリケーションルーチンの詳細説明。

アプリケーションは Web ページのリストに順次移動しています。各ページが処理されたら、ページを閉じて次のページをロードする必要があります。すべての Web ページには、別のドメインから Web ページをロードする iframe があります。confirmiframe 呼び出し内またはpopupそのonbeforeunloadイベント内にロードされた Web ページの場合を除いて、アプリケーションにまったく問題はありません。確認ポップアップ ボックスが原因で、アプリケーションがそれ以上 Web ページを処理できなくなります。このポップアップ確認ウィンドウを取り除く必要があります。

4

1 に答える 1

1

ポップアップのポップアップに問題がある場合は、ソリューションを含めました。クライアント マシンで JavaScript を無効/有効にしたい場合 (または、有効/無効の場合は単に読み取り/クエリを実行する場合) は、その回答を含めました。あなたのためにも、ここに行きます:

無効にするポップアップ メッセージを選択してください。アラート メッセージの場合は、これを試してください。ウィンドウまたはフレーム オブジェクトを特定のニーズに明らかに解決します。最上位のドキュメントを想定していますが、iframe が必要な場合は、window.frames(0) を使用してアクセスできます。最初のフレームなど... (JavaScript の部分)... WB が Web ブラウザー コントロールであると仮定した場合のコードを次に示します...

WB.Document.parentWindow.execScript "window.alert = function () { };", "JScript"

ただし、あなたの場合、印刷を無効にしたいので、単に交換.alertして.printください。

ページ全体の読み込みが完了した後にのみ、上記のコードを実行する必要があります。これを行うのは非常に難しいことを理解しています (完全な証明バージョンはまだ公開されていません)。これで、「webbrowser」および「webbrowser-control」とラベル付けされた以前の回答のいくつかを読むと、これを正確に行う方法に関するヒントを収集できますが、.confirm JavaScript をキャンセルしたい場合は、目前の質問に戻ります。 window.alert を window.confirm に置き換えるだけです (もちろん、使用しているドキュメント階層に到達するための正しいオブジェクトで window. オブジェクトを修飾します)。上記の手法と新しい IE9 の .prompt メソッドを使用して .print メソッドを無効にすることもできます。

新しい IE9 ポップアップを含む 4 つのポップアップを取り除く定数文字列 (VB で宣言) を次に示します。さらに、onbeforeunload イベントを取り除き、実行されるすべてのページでこれらすべてを実行します。フレームがある場合は、フレームで実行する必要はありません。親ドキュメントで実行するだけで十分です。ここで (VB6 で宣言されています)、_ は読みやすくするために配置した行の継続用であり、& は文字列の連結用であり、; は javascript では、次のコードを別のコード行と見なすことを意味します。このようにして、物理的な 1 行で多くのコード行 (以下では 5 行だと思います) を実行できます。

Public Const DEFAULT_JS_TO_RUN_AFTER_EACH_PAGE_LOAD As String = _
& "window.alert = function () { }; window.confirm = function () { }; " _
& "window.prompt = function () { }; window.print = function () { }; " _
& "window.onbeforeunload = function () { };"

JavaScript を完全に無効にする場合は、レジストリを使用してこれを行うことができます。また、Web ブラウザー コントロールがメモリにロードされる前にレジストリを変更する必要があります。変更するたびに (オンとオフを切り替える)、Web ブラウザー コントロールをリロードする必要があります。そしてメモリに入れます(または単にアプリケーションを再起動します)。

レジストリ キーは \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\ です。キー名は 1400 で、無効にする値は 3、有効にする値は 0 です。

もちろん、Zones キーの下には 5 つのゾーンがあるため、確実にアクティブなゾーンまたはすべてのゾーンに対して変更する必要があります。ただし、js ダイアログのポップアップ メッセージを抑制したいだけであれば、これを行う必要はありません。

どうやって行くのか教えてください。さらにお手伝いできることがあれば教えてください。

于 2012-08-31T11:44:59.033 に答える