如何确保在完成活动后使用webBrowser?

时间:2015-10-05 00:31:19

标签: c# .net winforms

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using HtmlAgilityPack;
using mshtml;

namespace Extract_Images
{
    public partial class Form1 : Form
    {
        private string[] linkstoextract;
        private int numberoflinks;
        private string mainlink;
        private WebClient client;
        private WebBrowser webBrowser1;

        public Form1()
        {
            InitializeComponent();

            webBrowser1 = new WebBrowser();
            webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;


            label1.Text = "Number of links: ";

            mainlink = "http://www.test.com/index";
            numberoflinks = 211;
            for (int i = 0; i < numberoflinks; i++)
            {
                webBrowser1.Navigate(mainlink + i + ".html");
                GetHtmlFromUrl(mainlink + i + ".html");
            }

        }

        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            throw new NotImplementedException();
        }


        private void GetHtmlFromUrl(string url)
        {

            IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
            IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange();

            foreach (IHTMLImgElement img in doc.images)
            {
                imgRange.add((IHTMLControlElement)img);

                imgRange.execCommand("Copy", false, null);

                using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))
                {
                    bmp.Save(@"C:\" + img.nameProp);
                }
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

问题在于,现在我使用for循环遍历每个链接并提取图像。

问题出现之前它将从第一个链接中提取所有图像,它将继续执行for循环,并且已经尝试浏览到下一个链接。

我需要某种方式可能使用时间和其他或其他东西来确保它将浏览第一个链接将到达已完成的事件那里它将提取所有图像链接只有当它完成工作从第一个提取所有图像html然后继续循环中的下一个。

接下来,我有所有页面的所有图像链接列表,然后我想使用链接下载所有图像。但问题是如上所述。

1 个答案:

答案 0 :(得分:0)

我对您的代码进行了一些更改,但仅在文本编辑器中进行了更改,因此我没有编译时间检查或逻辑验证的任何好处 - 抱歉。但希望我建议的代码可以帮助您找到一种方法,让操作顺序按照您想要的方式运行。

 @Override
    public void onBackPressed() {

        //overridePendingTransition(R.anim.play_panel_close_foreground, R.anim.play_panel_close_background);
        //PlayPanel.super.onBackPressed();

        Intent intent = new Intent(PlayPanel.this, MainActivity.class);
        startActivity(intent);
        overridePendingTransition(0, R.anim.play_panel_close_background);

    }

总结建议的更改:

  • 我创建了一个范围为Form的变量public partial class Form1 : Form { private string[] linkstoextract; private int numberoflinks; private int currentLinkNumber = 0; private string mainlink; private WebClient client; private WebBrowser webBrowser1; public Form1() { InitializeComponent(); webBrowser1 = new WebBrowser(); webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; label1.Text = "Number of links: "; mainlink = "http://www.test.com/index"; numberoflinks = 211; ProcessNextLink(); } private void ProcessNextLink() { if (currentLinkNumber < numberoflinks) { currentLinkNumber++; webBrowser1.Navigate(mainlink + currentLinkNumber.ToString() + ".html"); } } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { ProcessImagesFromDocument(); ProcessNextLink(); } private void ProcessImagesFromDocument() { IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange(); foreach (IHTMLImgElement img in doc.images) { imgRange.add((IHTMLControlElement)img); imgRange.execCommand("Copy", false, null); using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) { bmp.Save(@"C:\" + img.nameProp); } } } } ,用于跟踪正在处理的当前“链接” - 这与您的变量currentLinkNumber的角色相同i循环
  • 我将for移动并将变量递增到自己的方法,以便我们可以在完成下载之后使用Navigate调用方法处理当前链接
  • 我将您的DocumentCompleted方法重命名为GetHtmlFromUrl,因为此时不需要ProcessImagesFromDocument参数,我也将调用移至url

希望有所帮助。