在popupwindow下载twebbrowser

时间:2013-02-05 05:48:03

标签: delphi twebbrowser

希望让我的delphi应用程序登录网站,导航到一个页面,并自动下载某些文件,How do I keep an embedded browser from prompting where to save a downloaded file?的解决方案对文件下载有很大的帮助。

最后一个问题是在弹出窗口中导航打开的最后一步,有很多解决方案可以通过实现TWebBrowser.NewWindow2捕获弹出窗口,但这些事件似乎都不适用于上面的代码,可以做些什么以上代码中的twebbrowser.invokeevent如何工作?

如果我使用invokeveent和dispid 273(newwindow3)来调用一个函数,我可以将第二个webbrowser调整到弹出窗口的url。

我的问题是弹出窗口基本上有一行javascript“document.print(parent.parent.opener.thefunction())”第二个twebbrowser没有引用它的父级,所以这个失败了。

我可以看到两个可能的解决方案,让TWebBrowser.NewWindow2或3触发,修复下面的代码示例,LVarArray [0] {const IDispatch},由于某种原因为空。

 procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams);
             // DispID 250 is the BeforeNavigate2 dispinterface and to the FFileSource here
          // is stored the URL parameter (for cases, when the IDownloadManager::Download
          // won't redirect the URL and pass empty string to the pszRedir)
          //showmessage('test');
          var
        ArgCount : Integer;
        LVarArray : Array of OleVariant;
        LIndex : Integer;
        begin
        inherited;
        ArgCount := AParams.cArgs;
        SetLength(LVarArray, ArgCount);
        for LIndex := Low(LVarArray) to High(LVarArray) do
        LVarArray[High(LVarArray)-LIndex] := OleVariant(TDispParams(AParams).rgvarg^[LIndex]);

        case ADispID of
          250: FFileSource := OleVariant(AParams.rgvarg^[5]);

        273: DoNewWindow3(Self,
         LVarArray[0] {const IDispatch},
          WordBool((TVarData(LVarArray[1]).VPointer)^) {var WordBool},
          LVarArray[2] {const OleVariant},
        LVarArray[3] {const OleVariant},
        LVarArray[4] {const OleVariant});
            end;
         end;

1 个答案:

答案 0 :(得分:2)

我不会直接回答你的问题,因为我认为你提出了错误的问题。您正尝试通过Internet下载文件,而不向用户显示任何GUI。因此,嵌入式浏览器只是错误的解决方案。

使用永不显示弹出对话框的工具,而不是尝试禁止弹出对话框。我相信你应该做的是使用直接HTTP下载下载文件。有许多不同的方法可以实现这一目标。例如,一个非常方便的方法,即Delphi开箱即用,就是使用Indy。我相信您需要的组件是TIdHttp