希望让我的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;
答案 0 :(得分:2)
我不会直接回答你的问题,因为我认为你提出了错误的问题。您正尝试通过Internet下载文件,而不向用户显示任何GUI。因此,嵌入式浏览器只是错误的解决方案。
使用永不显示弹出对话框的工具,而不是尝试禁止弹出对话框。我相信你应该做的是使用直接HTTP下载下载文件。有许多不同的方法可以实现这一目标。例如,一个非常方便的方法,即Delphi开箱即用,就是使用Indy。我相信您需要的组件是TIdHttp
。