(本文涉及IE\Internet Explorer\WebBrowser2\CHtmlView\name space)
商业网站的广告越做越大。新浪网的巨幅FLASH广告居然充满了整个屏幕!
广大网民上网可受不了这个.....小猫怎么会受得了FLASH的蹂躏~
怎么办呢?一般来说,IE控件可以禁用图片、视频、声音和控件
禁止控件自然就禁止了FLASH,但这样将使浏览器失去大不分功能,不于考虑。
那么过滤整个机器的URL可不可以呢?
可以,但那样底层的操作不是一步两步能实现的,另外....对整个系统以及浏览器的稳定性有较大影响。
也许你会说,做一个127.0.0.1的代理服务器过滤FLASH,再让给自己的浏览器使用该代理。结果会和上面一样,稳定性不好,还可能会和浏览器自身的代理发生冲突。
到底怎么做?呵呵~正题来了!首先感谢畅游的帮助。
利用name space!
下面就说在自编浏览器里的具体实现:(如果你想了解name space的更多内容请访问MSDN网站搜索"name space"关键字)
首先,给你的自编浏览器填加一个ATL类,填加之后CLASS向导会自动给你的工程加一个modul,这些我们都不必理会。
假设所填加的类叫:IAUrl
之后你要做的就是给类填加IInternetProtocolInfo和IInternetProtocol两个接口的实现。并加一个IInternetProtocolSink* m_pProtSink;成员变量。
下面要做的很简单:
找到IAUrl的Start函数(实现上面两个接口后回自动出现该函数)
实现如下代码:
STDMETHODIMP IAUrl::Start(
LPCWSTR szUrl,
IInternetProtocolSink *pIProtSink,
IInternetBindInfo *pIBindInfo,
DWORD grfSTI,
DWORD dwReserved)
{
// 检查URL请求的最后4个字符是否为.swf,是的话,就过滤掉
CString s(szUrl);
if(s.Right(4)==".swf")
{
m_pProtSink = pIProtSink;
m_pProtSink->AddRef();
m_pProtSink->ReportResult(S_OK, 0, 0);
m_pProtSink->Release();
return S_OK;
}
return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
}
针对IAUrl类的工作结束了。下面在你的窗口类里调用IIAUrl接口
给CMainFrame增加2个成员变量:
IInternetSession* m_pSession;
IClassFactory* m_pFactory;
然后在程序初始阶段(比如OnCreate里面)
//注册name space
HRESULT hr = CoGetClassObject(CLSID_IAUrl, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory);
if(hr==S_OK)
{
if(CoInternetGetSession(0, &m_pSession, 0)==S_OK)
m_pSession->RegisterNameSpace(m_pFactory, CLSID_IAUrl, L"http", 0, NULL, 0);
}
在程序结束的时候
//注销name space
if(m_pSession!=NULL)
{
m_pSession->UnregisterNameSpace(m_pFactory, L"http");
m_pSession->Release();
}
if(m_pFactory!=NULL)
m_pFactory->Release();
}
OK,搞定了,现在你的浏览器可以过滤FLASH了,嘿!效果真不错!
下载IAUrl类原代码:(3KB)