【发布时间】:2018-04-03 16:35:59
【问题描述】:
问题:我正在寻找绕过 FileDownload 弹出窗口并自动下载文件的方法。
实施细节
在我的 Windows 应用程序中,我使用 Webbrowser 组件来创建一个屏幕抓取应用程序。
我的 webBrowser1 使用一个视图呈现,该视图包含一个包含锚元素的 td 列(在其他 td 列中)的表(实际页面中使用的 Gridview)。单击锚点将从 SharePoint 下载相关文件。
一个样本:
<td><a href="javascript:__doPostBack('ctl00$PlaceHolderMain$TOC$ctl00','DownloadFile$0')">File 1</a></td>
为了自动下载,在我的 Windows 窗体中,我确实有一个“下载”按钮,在该按钮中尝试下载表中的第一个文件(最终将下载所有文档)。
我的挑战是下载文件,因为它显示在 FileDowload 弹出窗口中。
有没有办法禁用此弹出窗口并自动将文件下载到某个文件夹中。我知道它试图模仿 IE 功能。
我的下载代码如下:
private void btnDownload_Click(object sender, EventArgs e)
{
webBrowser1.Document.InvokeScript("__doPostBack", new string[] { "ctl00$PlaceHolderMain$TOC$ctl00", "DownloadFile$0"});
}
我尝试了各种方法。一种这样的方法是使用“urlmon.dll”并使用它的 URLDownloadToFile 方法。但看起来由于 URL 不是正常的 URL,它仍然不断提供 FileDownload 弹出窗口。
我尝试的另一种方法是使用“user32.dll”自动点击并使用 SendKeys 发送 {TAB} 和 {Enter} 键,但我无法获得此弹出窗口的句柄。
IntPtr hwnd = FindWindow("#32770", "File Download");
IntPtr a5 = FindWindow("#32770 (Dialog)", "File Download");
IntPtr nullptr = (IntPtr)0;
if (hwnd != nullptr)
{
SetActiveWindow(hwnd);
SendKeys.SendWait("{TAB}");
//SendKeys.SendWait("%S");
}
【问题讨论】:
-
听起来你是正确的道路。您是否尝试过在 Visual Studio 中使用 Spy++ 来查看句柄的外观以及该窗口的外观?很多时候,Windows 都隐藏在 Windows 内部,如果您没有引用正确的,它就不起作用。
-
您可能认为您拥有正确的窗口,但有时实际正确的窗口是您拥有的句柄的子窗口等。
-
谢谢亚历山大,我会试一试的!如果您看到其他实现相同目标的好选择(如果有),请告诉我。我还尝试了按照下面的链接禁用 IE 浏览器中的某些属性的建议,但看起来其中一些选项在 IE 中不再可用。 IE 被删除,因为它更多的是安全问题。链接:superuser.com/questions/246553/…
标签: c# webbrowser-control screen-scraping