CHtmlView中用OnNewWindow2方法打开的地址过滤

flyskytoday 2009-06-16 11:37:39
自定义了一浏览器,用CHtmlView类

打开新窗口用OnNewWindow2方法
有些链接我不需要,要过滤掉,就是点击无反应,或是点击打开后快速关闭(让用户感觉不到)
用OnBeforeNavigate2可以取得地址,但不能关闭子窗口
而且每当点击连接时,OnNewWindow2在OnBeforeNavigate2之前调用
查了OnBeforeNavigate2里面好象没有关闭的方法

这方面有谁知道吗?
感谢
...全文
585 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
norsd 2009-06-19
  • 打赏
  • 举报
回复
汗死啊,你的vc6里面没有newwindow3,
你等等,newwindow3 对应的DISPID是: 273

你最好用newwindow3 , 用newwindow2很麻烦.

你如果还是喜欢newwindow2,只能向我说的后台开一个窗口然后判断是否显示.

flyskytoday 2009-06-19
  • 打赏
  • 举报
回复
to:norsd
p.s: 你的New Window是 ie页面,还是你的WebBrowser?
->新窗口是在我的浏览器中打开。

我用调试环境看了NewWindow2中好象没有地址内容
NewWindow3?查了VC6里面好象没有方法

关于你说的地址截获,在OnBeforeNavigate2消息中就可以完成。但是,关闭不了新打开的子窗口
这个还是不太明白

非常感谢你的回答
flyskytoday 2009-06-18
  • 打赏
  • 举报
回复
大哥,,,此方法并没有怎么过滤网址

就是说过滤后,不要打开新窗口的(或者立即关闭)
norsd 2009-06-18
  • 打赏
  • 举报
回复
1. 对于每个 NewWindow2( IDispatch **ppDisp, VARIANT_BOOL *Cancel );


*ppDisp = YourBackgroundWebBrowser ;
*Cancel = VARIANT_TRUE ;


2. 截获 YourBackgroundWebBrowser的 NavigateComplete2 消息

void NavigateComplete2(
IDispatch *pDisp,
VARIANT *URL
);

在navigateComplete2中判断 url

重新NewWindow.

p.s: 你的New Window是 ie页面,还是你的WebBrowser?

norsd 2009-06-18
  • 打赏
  • 举报
回复
OnNewWindow2

是 DWebBrowserEvents2::NewWindow2 这个事件的包装,

void NewWindow2(
IDispatch **ppDisp,
VARIANT_BOOL *Cancel
);

其中没有url信息, 可以的话应该使用
void NewWindow3(
IDispatch **ppDisp,
VARIANT_BOOL *Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
);

如果无法使用NewWindow2(...)比如ie6,xp sp1.
就比较麻烦,但是也有办法。
aa3000 2009-06-17
  • 打赏
  • 举报
回复

#pragma once

#include <afxhtml.h>

// CHtmlCtrl Html 视图

class CHtmlCtrl : public CHtmlView
{
DECLARE_DYNCREATE(CHtmlCtrl)

public:
CHtmlCtrl(BOOL bNewWindow = FALSE);; // 动态创建所使用的受保护的构造函数
virtual ~CHtmlCtrl(){ };

BOOL CreateFromStatic(UINT nID, CWnd* pParent);

public:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

BOOL m_bNewWindow;

CHtmlCtrl * m_pHtmlCtrlHandleNewWindow;

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel);
afx_msg void OnDestroy();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);
protected:
virtual void PostNcDestroy();
};



// HtmlCtrl.cpp : 实现文件
//

#include "stdafx.h"
#include "HtmlCtrl.h"
// CHtmlCtrl

IMPLEMENT_DYNCREATE(CHtmlCtrl, CHtmlView)


void CHtmlCtrl::DoDataExchange(CDataExchange* pDX)
{
CHtmlView::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView)
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
END_MESSAGE_MAP()


// CHtmlCtrl 诊断

#ifdef _DEBUG
void CHtmlCtrl::AssertValid() const
{
CHtmlView::AssertValid();
}

void CHtmlCtrl::Dump(CDumpContext& dc) const
{
CHtmlView::Dump(dc);
}
#endif //_DEBUG


// CHtmlCtrl 消息处理程序
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
{
CStatic wndStatic;
if (!wndStatic.SubclassDlgItem(nID, pParent))
return FALSE;

// Get static control rect, convert to parent's client coords.
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();

// create HTML control (CHtmlView)
return Create(NULL, // class name
NULL, // title
(WS_CHILD | WS_VISIBLE ), // style
rc, // rectangle
pParent, // parent
nID, // control ID
NULL); // frame/doc context not used
}

//开始链接时会触发此事件
void CHtmlCtrl::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD /*nFlags*/, LPCTSTR /*lpszTargetFrameName*/, CByteArray& /*baPostedData*/, LPCTSTR /*lpszHeaders*/, BOOL* pbCancel)
{
*pbCancel = FALSE;

if (m_bNewWindow)
{
*pbCancel = TRUE;

CString sUrl = lpszURL;
// 处理新建窗口的url
if (sUrl.Find(_T("http://www.csdn.net")) != -1)
{
// 拦截
}
else
{
// 不拦截 ShellExecute 打开新窗口或做其他处理
}
}
}

void CHtmlCtrl::OnDestroy()
{
// This is probably unnecessary since ~CHtmlView does it, but
// safer to mimic CHtmlView::OnDestroy.
if (m_pBrowserApp)
{
m_pBrowserApp = NULL;
}
CWnd::OnDestroy(); // bypass CView doc/frame stuff
}

BOOL CHtmlCtrl::OnEraseBkgnd(CDC* /*pDC*/)
{
return true;
}

void CHtmlCtrl::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy); //Changed by thilon on 2006.08.10

if (::IsWindow(m_wndBrowser.m_hWnd))
{
CRect rect;
GetClientRect(rect);
// 就这一句与CHtmlView的不同
::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE);
m_wndBrowser.SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
}
}

void CHtmlCtrl::PostNcDestroy()
{
if (m_pHtmlCtrlHandleNewWindow)
{
delete m_pHtmlCtrlHandleNewWindow;
m_pHtmlCtrlHandleNewWindow = NULL;
}
}

void CHtmlCtrl::OnNewWindow2( LPDISPATCH* ppDisp, BOOL* Cancel )
{
if (!m_pHtmlCtrlHandleNewWindow)
{
RECT rc = {0, 0, 100, 200};

m_pHtmlCtrlHandleNewWindow = new CHtmlCtrl(TRUE);

m_pHtmlCtrlHandleNewWindow->Create(NULL, // class name
NULL, // title
(WS_CHILD), // style
rc, // rectangle
this, // parent
10000, // control ID
NULL);
}

*ppDisp = m_pHtmlCtrlHandleNewWindow->GetApplication();
}

CHtmlCtrl::CHtmlCtrl( BOOL bNewWindow /*= FALSE*/ )
{
m_bNewWindow = bNewWindow;
m_pHtmlCtrlHandleNewWindow = NULL;
}
flyskytoday 2009-06-16
  • 打赏
  • 举报
回复
可否详细说明一下吗?
还是不太明白
[Quote=引用 1 楼 aa3000 的回复:]
OnNewWindow2 可以提供一个自己的 IDispatch ,这个 IDispatch 可以从一个隐藏的 CHtmlView 中获得,在 CHtmlView 的 OnBeforeNavigate2 cancel 掉就可以了
[/Quote]
aa3000 2009-06-16
  • 打赏
  • 举报
回复
OnNewWindow2 可以提供一个自己的 IDispatch ,这个 IDispatch 可以从一个隐藏的 CHtmlView 中获得,在 CHtmlView 的 OnBeforeNavigate2 cancel 掉就可以了

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧