1

C# で記述された Internet Explorer ブラウザー ヘルパー オブジェクト (BHO) があり、さまざまな場所でモーダル ダイアログとしてフォームを開きます。これは機能する場合もありますが、機能しない場合もあります。私が現在再現できるケースは、IEがjavascriptを実行して他の子ウィンドウを開く場合です...どこかで少し混乱していると思います....

問題は、私が呼び出すときです:

(new MyForm(someParam)).ShowDialog();

フォームはモーダルではないので、IE ウィンドウをクリックしてフォーカスを得ることができます。IE はコードの実行中に更新されないため、ユーザーには IE がハングしているように見えます。

フォームがモーダルとして開かれるようにする方法はありますか。つまり、フォームを IE ウィンドウの後ろに隠すことはできません。

(私はIE7を使用しています。)

注意: Java を使用していますが、これはこの投稿と同様の質問です。解決策は、IEウィンドウのIWin32Windowを正しく渡すことだと思いますので、それを調べています。

4

2 に答える 2

2

以下は、Ryan/Rory の WindowWrapper コードのより簡潔なバージョンです。

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
于 2010-02-26T13:37:35.430 に答える
1

自分の質問に答えるつもりはなかったのですが…

正しいIWin32WindowをShowDialog()メソッドに渡すと、正常に機能するようです。秘訣はこれをどうやって手に入れるかです。これが私がこれを行った方法です。ここで、「siteObject」はBHOのSetSite()メソッドに渡されるオブジェクトです。

IWebBrowser2 browser = siteObject as IWebBrowser2;
if (browser != null) hwnd = new IntPtr(browser.HWND);
(new MyForm(someParam)).ShowDialog(new WindowWrapper(hwnd));

...

// Wrapper class so that we can return an IWin32Window given a hwnd
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

WindowWrapperクラスを提供してくれたRyanに感謝しますが、これを行うための組み込みの方法があるといいのですが。

更新:これは、保護モードのIE8では機能しません。これは、本来あるべき範囲外のHWNDにアクセスしているためです。代わりに、現在のタブのHWND(または他の解決策?)を使用する必要があります。たとえば、これを取得する方法については、この投稿の.netの例を参照してください。

于 2008-09-24T12:57:49.730 に答える