在屏幕抓取中禁用FileDownload Popup(使用Webbrowser控件)

时间:2018-04-03 16:36:00

标签: c# webbrowser-control screen-scraping

问题:我正在寻找绕过FileDownload弹出窗口并自动下载文件的方法。

实施细则
在我的Windows应用程序中,我使用Webbrowser组件来创建屏幕抓取应用程序。 我的webBrowser1呈现的视图包含一个表(实际页面中使用的Gridview),其中包含一个包含锚元素的td列(以及其他td列)。单击锚点将从SharePoint下载相关文件 一个样本:

<td><a href="javascript:__doPostBack('ctl00$PlaceHolderMain$TOC$ctl00','DownloadFile$0')">File 1</a></td>

要自动下载,我的Windows窗体中有一个&#34;下载&#34;按钮,其中试图下载表中的第一个文件(最终将下载所有文件)。

我的挑战是下载文件,因为它随FileDowload弹出窗口一起显示。 enter image description here
有没有办法禁用此弹出窗口并自动将文件下载到某个文件夹中。我知道它试图模仿IE功能。 我的下载代码如下:

private void btnDownload_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.InvokeScript("__doPostBack", new string[] { "ctl00$PlaceHolderMain$TOC$ctl00", "DownloadFile$0"});

        } 

我尝试了各种方法。一种这样的方法是使用&#34; urlmon.dll&#34;并使用其URLDownloadToFile方法。但看起来因为URL不是普通的URL,它仍然保持提供FileDownload弹出窗口。

我尝试的另一种方法是使用&#34; user32.dll&#34;自动化点击。并使用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");
        }

1 个答案:

答案 0 :(得分:0)

//在下载事件开始或下载按钮之后,单击文件下载弹出窗口 //将显示在webbrowser控件中。输入以下代码

            Thread now = new Thread(() =>
            {
                Thread.Sleep(2000); 
                // string nu = GetActiveWindowTitle();
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Enter}"); 
                Thread.Sleep(4000); 
                // now create filename path
                string filepath=@"c:\download\thisdownloadfilehere.pdf"
                SendKeys.SendWait(filepath); 
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Enter}");

            });
            now.Start();