用自己所有分,求问:VC中使用webbrowser,我想拦截下载对话框,程序指定默认下载路径,取出文件名,有请jiangsheng(蒋晟)大哥继续帮忙,谢谢大家

程序员小哈
嵌入式领域优质创作者
博客专家认证
2009-11-20 04:04:33
之前我发过一个求问此问题的帖子了,困扰我一个月了也没有解决,现提供网址供大家参考一下,希望大家能够多多指点,我仅有190分,全部奉上,项目就差这一块了,希望大家能够帮忙,先谢谢大家了。http://topic.csdn.net/u/20091028/16/db45edcc-bc4a-42e7-950a-93c0c78f0a01.html
首先感谢:tttyd(雪影)、jiangsheng(蒋晟)、ljz888666555(终于找到了)三位的热心帮助,希望本帖可以得到你们的继续关注。
我现在把我的问题再描述一遍:
我的项目中用到了webbrowser这个控件,我现在想实现下载文件时隐藏下载保存对话框,那个站点是我们自己做得,我只是想把下载的文件存到固定路径,并要获取其文件名,然后我的程序要在下载完毕之后加载那个文件,现在不知道怎么屏蔽那个下载对话框,而且也不知道怎么得到那个被下载文件的文件名。功能有点像风行软件,点击一个节目之后,它会把bt下载的文件自动保存在它下载所在目录,然后自动打开那个下载任务,整个过程没有出现下载,另存为的对话框。我不用像迅雷,flashget一样拦截所有的下载事件。
经过上个帖子我得知,因为我只是用WebBrowser打开我自己的站点,所以我不需要实现全局下载器IDownloadManager接口,jiangsheng(蒋晟)大哥说:只抓自己的程序的下载的话不用注册到全局的。在容器的IOleClientSite实现这里添加就行了。我对COM不熟悉,我不知道如何实现IOleClientSite,实现之后如何使用,jiangsheng(蒋晟)大哥说:http://blog.joycode.com/jiangsheng/archive/2007/07/03/104995.joy 和这里实现INewWindowManager的方法一样。我也认真读了,整个代码的思路我可以读懂,但是让我移植我就不会了,请大家不要嘲笑我,真诚虚心向大家请教,希望能够得到进一步指点,如果能得到一个拦截下载对话框的demo的话,那就更感激不尽了(虽然这个要求比较过分,但还是妄想了一下)要是有demo可以发到ju_by@126.com这个邮箱啊:)

我尽然无权使用大于100分的可用分,只能开100分的帖子了,我会在问题解决之后,另开帖子,把剩余的90分奉上,谢谢
...全文
662 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingmei02 2012-10-29
  • 打赏
  • 举报
回复
楼主您好,您用NewWindow3可以实现拦截下载对话框吗?小弟用NewWindow3可以拦截除了ie下载窗口之外的所有窗口,可就是拦截不了ie下载对话框,点击下载链接的时候根本就没有响应NewWindow3,请问您是怎么实现的,可以详细说明一下吗?谢谢!!!
程序员小哈 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jiangsheng 的回复:]
VC6里面的CWnd没有CreateControlSite。只能用AfxEnableControlContainer重载全局的control container。参考http://support.microsoft.com/kb/236312
[/Quote]
是呀,VC6中好麻烦,昨天我以为这个问题解决了呢,我拿VS2005测试的,没有问题,今天往我的项目中移植,我的项目是VC6的,却发现VC6中的WebBrowser的OnNewWindow3事件不响应,请问jiangsheng(蒋晟)大哥,VC6中如何使用OnNewWindow3事件呢?如果可以使用的话,我的问题就解决了。
还有您给我的参考链接:http://support.microsoft.com/kb/236312
他是屏蔽鼠标右键的啊?跟我的要拦截下载对话框有关系吗?仿照那个参考链接,在其中重写一个OnNewWindow3函数吗?
这个帖子已经结了,问题解决了,我会把昨天返还给我的100分送给您,麻烦您了
蒋晟 2009-11-21
  • 打赏
  • 举报
回复
VC6里面的CWnd没有CreateControlSite。只能用AfxEnableControlContainer重载全局的control container。参考http://support.microsoft.com/kb/236312
程序员小哈 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jiangsheng 的回复:]
OnNewWindow3可以响应的,方法和NewWindow2一样,只是dispid和参数不同。
http://support.microsoft.com/kb/236312是在VC6下扩展control site的方法。要拦截下载对话框的话,扩展control site,实现IServiceProvider并且提供IDownloadManager服务
[/Quote]

谢谢你jiangsheng(蒋晟) 哥,问题解决了,是上面那个xmzzy兄给的答案,VC6有NewWindow3,也可以用,只是向导生成的函数有问题,导致不正确,谢谢您了,我分都给xmzzy了,对不住了,不能给你分了,再次表示感谢。jiangsheng(蒋晟)咱俩是校友啊,我是07级吉大化学系的^_^
蒋晟 2009-11-21
  • 打赏
  • 举报
回复
OnNewWindow3可以响应的,方法和NewWindow2一样,只是dispid和参数不同。
http://support.microsoft.com/kb/236312是在VC6下扩展control site的方法。要拦截下载对话框的话,扩展control site,实现IServiceProvider并且提供IDownloadManager服务
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
问题解决了,特别感谢xmzzy的无私帮助,我的确走弯路,现已试验成功,结贴给分。
实现诺言,请xmzzy再去这个帖子领取剩余的90分^_^
http://topic.csdn.net/u/20091120/22/4154839b-5a57-47ed-989f-d77c47502943.html
先说一下我的程序,是在xmzzy兄提示的基础改的,避免后人走弯路:
#include <wininet.h>
#pragma comment(lib, "Wininet.lib")

#define MAXBLOCKSIZE 1024

/**
* 执行 文件下载 操作
* @param Url: The target action url
*
*/
void download(const char *Url)
{
CTime m_tmCurrentTm = CTime::GetCurrentTime();
CString strCurTime,strFullPath,m_strFilePath; //当前时间与保存路径
strCurTime = m_tmCurrentTm.Format("%Y%m%d%H%M%S.torrent");
m_strFilePath = "C:\\GTDownloads\\torrents\\";
strFullPath = m_strFilePath + strCurTime;

HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (handle2 != NULL)
{
printf("%s\n",Url);
byte Temp[MAXBLOCKSIZE];
ULONG Number = 1;

FILE *stream;
if( (stream = fopen( strFullPath, "wb" )) != NULL )//这里只是个测试,因此写了个死的文件路径
{
while (Number > 0)
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
//fprintf(stream, (const char*)Temp);
fwrite(Temp, sizeof (char), Number , stream);
}
fclose( stream );
}

InternetCloseHandle(handle2);
handle2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}

if (PathFileExists(strFullPath))
{
HANDLE hDownloader = NULL;
if ((hDownloader =m_dlg->m_downloaderList.AddDownloader (strFullPath, "C:\\GTDownloads\\")) != NULL)
{
//DLBT_Downloader_SetDownloadLimit (hDownloader, dlg.m_downloadSpeedLimit);
if (m_dlg->m_timer == NULL)
{
m_dlg->m_timer = m_dlg->SetTimer (REFRESH_TIMER, 1000, NULL);
}
}
}
}

BEGIN_EVENTSINK_MAP(CDLBT_DemoDlg, CDialog)
ON_EVENT(CDLBT_DemoDlg, IDC_EXPLORER1, 273, CDLBT_DemoDlg::NewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_UI4 VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()

void CDLBT_DemoDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
// TODO: 在此处添加消息处理程序代码
CString strURL(bstrUrl);
*Cancel = true;
// MessageBox(strURL);
if (strURL.Find("TID")!=-1) //TID是可下载路径中一个标示根据实际情况变换
{
download(strURL);
}
else //下面语句存在的目的是让新链接在一个webbrowser中打开
{
COleVariant varEmpty;
COleVariant varURL(strURL);
m_web.Navigate2(varURL, varEmpty,varEmpty,varEmpty,varEmpty);
}
}
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xmzzy 的回复:]
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#define MAXBLOCKSIZE 1024

void download(const char*);

int main(int argc, char* argv[]){
if(argc > 1){
  download((const char*)argv[1]);
}else{
  printf("Usage: auto-Update url");
}
return 0;
}


/**
* 执行 文件下载 操作
* @param Url: The target action url
*
*/
void download(const char *Url)
{
HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_divCONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
  HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
  if (handle2 != NULL)
  {
  printf("%s\n",Url);
  byte Temp[MAXBLOCKSIZE];
  ULONG Number = 1;

  FILE *stream;
  if( (stream = fopen( "F:\\LeadBridge\\new.exe", "wb" )) != NULL )//这里只是个测试,因此写了个死的文件路径
  {
    while (Number > 0)
    {
    InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
    //fprintf(stream, (const char*)Temp);
    fwrite(Temp, sizeof (char), Number , stream);
    }
    fclose( stream );
  }
 
  InternetCloseHandle(handle2);
  handle2 = NULL;
  }
  InternetCloseHandle(hSession);
  hSession = NULL;
}
}

下载文件的核心代码
[/Quote]
好感谢你啊,我实验成功后立即结贴,感谢你这么认真的回复:)
xmzzy 2009-11-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#define MAXBLOCKSIZE 1024

void download(const char*);

int main(int argc, char* argv[]){
if(argc > 1){
download((const char*)argv[1]);
}else{
printf("Usage: auto-Update url");
}
return 0;
}


/**
* 执行 文件下载 操作
* @param Url: The target action url
*
*/
void download(const char *Url)
{
HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_divCONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (handle2 != NULL)
{
printf("%s\n",Url);
byte Temp[MAXBLOCKSIZE];
ULONG Number = 1;

FILE *stream;
if( (stream = fopen( "F:\\LeadBridge\\new.exe", "wb" )) != NULL )//这里只是个测试,因此写了个死的文件路径
{
while (Number > 0)
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
//fprintf(stream, (const char*)Temp);
fwrite(Temp, sizeof (char), Number , stream);
}
fclose( stream );
}

InternetCloseHandle(handle2);
handle2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
}

下载文件的核心代码
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xmzzy 的回复:]
BEGIN_EVENTSINK_MAP(CwebbrowserDlg, CDialog)
ON_EVENT(CwebbrowserDlg, IDC_EXPLORER1, 273, CwebbrowserDlg::NewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_UI4 VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()
[/Quote]
这个链接我得到过,就是知道之后我要怎么下载呢?或许上面那位朋友说的使用CInternetFile就可以下载了,我试试吧,或许我被IOleClientSite这个接口的实现给迷惑了,走进了怪圈,先谢谢,我这就去实验去^_^这两天问问题,被鄙视的自信心严重受损,再次谢谢你
xmzzy 2009-11-20
  • 打赏
  • 举报
回复
BEGIN_EVENTSINK_MAP(CwebbrowserDlg, CDialog)
ON_EVENT(CwebbrowserDlg, IDC_EXPLORER1, 273, CwebbrowserDlg::NewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_UI4 VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()
xmzzy 2009-11-20
  • 打赏
  • 举报
回复
在你的WEBBrowser控件的宿主对话框里响应newwindows3事件通知(你点击一个链接后就会发出这个事件,是用来在新窗口中打开你点击的链接网页),然后在NewWindow3的处理函数中就可以获取到你点击的链接地址(我想这个地址就是你想拦截的地址吧),然后*Cancel = true;(这样就不会弹出默认的下载对话框了

void CwebbrowserDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
// TODO: 在此处添加消息处理程序代码
//可以对bstrURL作一下判断看是文件链接还是网址
MessageBox(bstrUrl);

*Cancel = true;
}
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ttwtt 的回复:]
可不可以尝试一下自己用 CInternetFile,读取网络文件,再写入本地。用这个下图片是可以的,别的文件应该也可行.
[/Quote]
谢谢你的回复,我这个软件跟风行的用途比较想象,给大家使用的情况下,我也不清楚用户点击的是普通链接还是可下载的文件,虽然我可以在打开链接的事件中得到链接名,看看其是不是可下载文件,然后用您说的方法下载到本地,但是这样下载对话框会不会还显示出来呢?我先试试您的方法:)比较想知道IOleClientSite这个接口这个接口如何使用^_^
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
可不可以尝试一下自己用 CInternetFile,读取网络文件,再写入本地。用这个下图片是可以的,别的文件应该也可行.
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tanwei1002 的回复:]
可以屏蔽webbrowser的右键
[/Quote]
您好,屏蔽右键我在Codeproject上找到定制的方法了,可是好像不能实现我的要求啊,我想点击一个下载链接时,不弹出下载对话框,而是在后台直接把下载的文件保存到一个路径中或者直接加载也可以,我现在就是不知道如果实现了IOleClientSite这个接口,应该用IOleClientSite这个接口中SaveObject、GetMoniker 、GetContainer 、ShowObject 、OnShowWindow 、RequestNewObjectLayout 这六个方法中哪个方法来拦截下载对话框,并得到下载文件名呢?
Dingnifei123 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 laowu_ 的回复:]
呃,友情UP等专家。
[/Quote]
同意!!
tanwei1002 2009-11-20
  • 打赏
  • 举报
回复
可以屏蔽webbrowser的右键
程序员小哈 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 laowu_ 的回复:]
呃,友情UP等专家。
[/Quote]
谢谢,补充一句,我的项目使用VC6开发的
_JeffreyWu 2009-11-20
  • 打赏
  • 举报
回复
呃,友情UP等专家。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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