C# WinForm Webbrowser 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口(续)

上面那个文写的如同粑粑一样

效果图

Winfrom 中添加这个类就好了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace IE
{
    public class WebBrowserUrl : CancelEventArgs
    {
        public String Url { get; }

        public String Frame { get; }

        public WebBrowserUrl(String url, String frame) : base()
        {
            this.Url = url;
            this.Frame = frame;
        }
    }

    public class WebBrowserUrl2
    {
        public String Url { get; }

        public String Frame { get; }

        public WebBrowserUrl2(String url, String frame)
        {
            this.Url = url;
            this.Frame = frame;
        }
    }
    public class WebBrowserEvent
    {
        public bool cancel;
    }

    public class NewWebBrwser : WebBrowser
    {
        System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
        NewWebBrowserEvent events;

        public event EventHandler BeforeNavigate;

     //   public event EventHandler BeforeNewWindow;

        public delegate void OnNewWindow2(WebBrowserUrl2 webPra, WebBrowserEvent cancel);

        public event  OnNewWindow2 BeforeNewWindow2;

        protected override void CreateSink()
        {
            base.CreateSink();//还是需要源
            events = new NewWebBrowserEvent(this);
            cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(INewDWWebBrowserEvent));
        }
        protected override void DetachSink()
        {
            if (null != cookie)
            {
                cookie.Disconnect();
                cookie = null;
            }
            base.DetachSink();
        }
        public void OnBeforeNavigate(string url, string frame, out bool cancel)
        {
            var Arg = BeforeNavigate;
            WebBrowserUrl webBrowserUrl = new WebBrowserUrl(url, frame);
            Arg?.Invoke(this, webBrowserUrl);
            cancel = webBrowserUrl.Cancel;
        }
        public void OnBeforeNewWindow(string url, out bool cancel)
        {
            //var Arg = BeforeNewWindow;
            //WebBrowserUrl webBrowserUrl = new WebBrowserUrl(url, null);
            //Arg?.Invoke(this, webBrowserUrl);
            //cancel = webBrowserUrl.Cancel;
            var Arg = BeforeNewWindow2;
            WebBrowserUrl2 webBrowserUrl = new WebBrowserUrl2(url, null);
            WebBrowserEvent webBrowserEvent = new WebBrowserEvent();
            Arg?.Invoke(webBrowserUrl,webBrowserEvent);
            cancel = webBrowserEvent.cancel;
        }

    }
    public class NewWebBrowserEvent : System.Runtime.InteropServices.StandardOleMarshalObject, INewDWWebBrowserEvent
    {
        private NewWebBrwser webBrowser;

        public NewWebBrowserEvent(NewWebBrwser newWebBrowser) => webBrowser = newWebBrowser;

        public void BeforeNavigate2(object pDisp, ref object urlObject, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
        {
            webBrowser.OnBeforeNavigate((string)urlObject, (string)targetFrameName, out cancel);
        }
        //官方说明此 事件是低于IE6时会引发
        public void NewWindow2(ref object ppDisp, ref bool cancel)
        {

            webBrowser.OnBeforeNewWindow(((WebBrowser)ppDisp).Url.ToString(), out cancel);
        }
        //当高于IE6时使用
        public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)
        {
            webBrowser.OnBeforeNewWindow((string)URL, out cancel);
        }
    }
     [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
      System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),
      System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]
    public interface INewDWWebBrowserEvent
    {
        [System.Runtime.InteropServices.DispId(250)]
        void BeforeNavigate2(object pDisp, ref object urlObject, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel);
        //官方说明此 事件是低于IE6时会引发
        [System.Runtime.InteropServices.DispId(251)]
        void NewWindow2(ref object ppDisp, ref bool cancel);
        //当高于IE6时使用
        [System.Runtime.InteropServices.DispId(273)]
        void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL);
    }

}

使用方式

原文地址:https://www.cnblogs.com/T-ARF/p/9996806.html

时间: 2024-10-17 00:42:32

C# WinForm Webbrowser 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口(续)的相关文章

.NET4.5 WFP中用WebBrowser获取/操作网页html代码

引言 想给自己之前写的网页小说爬虫程序更新换代,之前一直是用winform的形式写的程序,因此这一次更新打算把UI换成WPF(因为听说WPF很漂亮),顺便也以此引入WPF的学习. 那么作为网页爬虫程序,最重要的就是html源码的获取了,通常的获取方式有几种:HttpWebRequest.WebRequest.WebClient.WebBrowser等.由于我这里写的爬虫软件针对的网站需要先登录才能看到小说内容,而我一次爬取的内容不多都是短篇小说,因此不需要考虑到爬取的速度,因此自然是打算使用We

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

抓取网页链接

package com.smilezl.scrapy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.sql.Connection; import java.sql.DriverManager; import java.sq

WebBrowser自动点击链接 广告自动点击 Ads Auto Click

点击付费广告, 是目前比较流行的一种网络营销模式, 但是,如果你单纯的靠手工一个一个去点, 总觉得不划算  , 能不能实现自动的去点击呢? 答案是肯定的 .NET 里面的 WebBrowser, 可以满足我们的要求 如果你利用本文的思路,去做赚Money的事情,后果自负 (不过,目前这种事情已经不好做了,各付费网站都采取了应对措施,呵呵,魔高一尺,道高一丈,实现还是可行的,具体就靠大家自己去发挥了) 下面给出一部分核心代码,全部代码,请下载本文附带的项目源码 private void webBr

C# WebBrowser准确判断网页最终装载完毕

== 最近写了个软件叫WebAutoScript,目的用于,网页的自动操作处理,就是说,所有你在网页上面的操作,都可以录到一个脚本中,然后可以回放这个操作过程..我是说任何过程. 程序是用C#写的,其中遇到了一个难题,对于网页,我是用C#内置的WebBrowser控件控制,但是这个控件有个问题,就是不能准确判断网页什么时候最终装载完毕,如果这个不能判断的话,我根本不可以判断什么时候执行下一个动作,因为网页还没有打开,不可能去点击还没有出现的按钮等...google了海内外,竟然没有人搞定过,除非

如何让你的网页链接潇洒地在微信好友和朋友圈中传播

嗨,大家好,我是大花猫! 想必大家都在自己的微信朋友圈看到过别人分享的一些网页链接消息,但是你注意了吗?有些链接的图标是用的微信一张蓝色的默认图片,但是有些链接的图标却有着各自专门的图标(注:公众号的图文消息不在本文讨论行列中.),而且标题也和链接里面网站的标题不一样!(想想前段时间那个风靡朋友圈的贱贱的神经猫吧!)好啦!今天要跟大家分享的就是如何让自己的网页在微信分享朋友圈中拥有一个自己个性的图标以及自定义分享中的描述文字.(开始想着加这个功能是在学习了慕课网的<2048私人定制>以后做了第

winform WebBrowser如何修改使用默认的IE浏览器版本

在搜了一些相关资料原来WebBrowser使用的是IE的兼容模式进行浏览(IE7模式). 建议:先添加注册表中,然后使用注册表编辑器导出功能,产生reg注册文件:方便日后使用. Winform  WebBrowser引用IE版本问题 http://www.cnblogs.com/midcn/archive/2012/08/22/2650975.html 再谈IE的浏览器模式和文档模式 http://www.cnblogs.com/liuzhendong/archive/2012/04/27/24

JavaScript 网页链接调用Android程序

如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏览,你需要做的是让市面上的浏览器支持才行. 主要涉及到的问题就是关于Intent在字符串形式和Intent对象之间的转换.把Intent以字符串的形式传递给Android 里面的java代码接受,然后解析转化为对应Intent执行即可,主要涉及java和JavaScript的交互. 两种表现形式 I

手机微信内打开网页链接如何做到自动唤醒外部浏览器打开

在我们使用微信营销的时候,很容易碰到H5链接在微信内无法打开或在微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1.网页链接被举报次数过多.2.网页含违规内容,含敏感词.3.被腾讯检测系统判断为诱导分享内容.4.转发分享次数达上限 大多数的情况下都是被人举报次数过多导致链接被封,而举报的人群里其实目标用户并没有占很多,多数都是来自同行的恶意举报,这是没有办法的事情.当举报次数达到一定数量时,微信的检测系统就会检