1

希望让我的 delphi 应用程序登录网站、导航到页面并自动下载某些文件,解决方案如何防止嵌入式浏览器提示保存下载文件的位置?,对文件下载有很大帮助。

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

如果我使用 invokeveent 和 273(newwindow3) 的 dispID 来调用一个函数,我可以 twebbwowser.navigate() 第二个 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;
4

1 回答 1

2

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

与其试图抑制弹出对话框,不如使用从不显示弹出对话框的工具。我相信你应该做的是使用直接 HTTP 下载来下载文件。有许多不同的方法可以实现这一目标。例如,Delphi 开箱即用的一种非常方便的方法是使用 Indy。我相信您需要的组件是TIdHttp.

于 2013-02-05T09:13:16.810 回答