プロフィール

since

Author:since
#kdH5CGMk


Skype: sekishin_cs 登録する際は自己紹介のメッセージを必ずご記入ください。
PlayStation Network: sekishin_ps
このブログについて:

プログラミングとかCFWとか音楽とかいろいろやってるブログ。
趣味:
ゲーム、パソコン、プログラミング(Visual C#)とか。
他サイトでの活動:
ニコニコ動画で「元の曲で再現してみたシリーズ」などの作品を投稿しています。
詳細については、下記のリンクをクリックしてください。
ニコニコ動画プロフィール
自分の作品リスト

カウンター
現在の閲覧者数
Twitter
フルみっく伝染歌プレーヤー

Powered by Re:Moto
月別アーカイブ
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)
.NET の WebBrowser コントロールは不便だ。
WebBrowser コントロール使っててこんなことが起きました。

新しいウィンドウで開くリンク(ブログの外部リンクなど)をクリックすると、IEが起動してそこにWebページが表示される

というものです(IEは重いからあんまり使いたくない)。

標準のWebBrowserコントロールで新しいウィンドウが作成されるときには NewWindow イベントが来るんですけど、引数に Url が無いので、 ExtendedWebBrowser というクラスを作ります。WebBrowser を継承して ExtendedNewWindow というイベントを追加してみます。

参考:webBrowserで別のウインドウで開くときの開く先のURLの取得法, WebBrowser NewWindow event does not give the URL of the New Window in EventArgs
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class WebBrowserExtendedNavigatingEventArgs : CancelEventArgs
{
    private string _Url;
    public string Url
    {
        get { return _Url; }
    }

    private string _Frame;
    public string Frame
    {
        get { return _Frame; }
    }

    public WebBrowserExtendedNavigatingEventArgs(string url, string frame)
        : base()
    {
        _Url = url;
        _Frame = frame;
    }
}

public class ExtendedWebBrowser : WebBrowser
{
    AxHost.ConnectionPointCookie cookie;
    WebBrowserExtendedEvents events;

    protected override void CreateSink()
    {
        base.CreateSink();
        events = new WebBrowserExtendedEvents(this);
        cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));
    }

    protected override void DetachSink()
    {
        if (null != cookie)
        {
            cookie.Disconnect();
            cookie = null;
        }
        base.DetachSink();
    }

    public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNavigating;
    public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNewWindow;

    protected void OnExtendedNavigating(string url, string frame, out bool cancel)
    {
        EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNavigating;
        WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);
        if (null != h)
        {
            h(this, args);
        }
        cancel = args.Cancel;
    }

    protected void OnExtendedNewWindow(string url, out bool cancel)
    {
        EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNewWindow;
        WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);
        if (null != h)
        {
            h(this, args);
        }
        cancel = args.Cancel;
    }

    class WebBrowserExtendedEvents : StandardOleMarshalObject, DWebBrowserEvents2
    {
        ExtendedWebBrowser _Browser;
        public WebBrowserExtendedEvents(ExtendedWebBrowser browser)
        { _Browser = browser; }

        public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
        {
            _Browser.OnExtendedNavigating((string)URL, (string)targetFrameName, out cancel);
        }

        public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)
        {
            _Browser.OnExtendedNewWindow((string)URL, out cancel);
        }
    }

    [ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
     InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch),
     TypeLibType(TypeLibTypeFlags.FHidden)]
    public interface DWebBrowserEvents2
    {
        [DispId(250)]
        void BeforeNavigate2([In, MarshalAs(UnmanagedType.IDispatch)] object pDisp,
             [In] ref object URL, [In] ref object flags,
             [In] ref object targetFrameName, [In] ref object postData,
             [In] ref object headers, [In, Out] ref bool cancel);
       
[DispId(273)]
        void
NewWindow3(
            [In,
            MarshalAs
(UnmanagedType.IDispatch)] object pDisp,
           
[In, Out] ref bool cancel,
            [In] ref object flags,
            [In] ref object URLContext,
            [In] ref object URL);
    }
}

使い方は、まずビルドしてからフォームデザイナで WebBrowser コントロールのかわりに ExtendedWebBrowser をツールボックスから貼り付けて、プロパティウィンドウをイベントに切り替えてそこのExtendedNewWindowをダブルクリックすればイベントハンドラが生成されます。
プログラミング | 【2008-09-15(Mon) 11:50:43】 | Trackback:(0) | Comments:(0)
コメントの投稿
管理者にだけ表示を許可する

メニュー
C = カテゴリ
L = 最新

Home
せきしんのC#プログラミング
PSP C
│├プラグイン C
││└スクリーンショット撮影
│├カスタマイズ C
││├CFW M33 Update C
│││└5.00 M33
│││ ├5.00 M33-2
│││ ├5.00 M33-3
│││ ├5.00 M33-4
│││ ├5.00 M33-5
│││ └5.00 M33-6 L
│││  └1.50 Kernel
││├システムフォント変更
││├VSH MENU 使用方法
││├FWリンク集
││├ISO読み取り
││├ISO起動
││└ISO圧縮
│└PSP-3000
PCソフト C
 ├CamStudio New!
 ├携帯動画変換君
 └Web ブラウザ
  └Mozilla Firefox
   └Greasemonkey
リンク
カテゴリ
最新記事
最新コメント
最新トラックバック
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。