当前位置:编程学习 > C#/ASP.NET >>

c# winform 程序,断点调试可以正常,但是直接执行就不行

我的问题不好讲,听我慢慢讲来
首先这是一个方法,其中:
mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);
之类的,是在一个mbf窗口中显示运行的状态信息,不用管,

作用是搜索页面中符合条件的连接<a>然后调用obj[i].Parent.InvokeMember("click");
来模拟点击事件,作用是下载一个文件,跳出下载框
里面的f8,messagebox在timer中,作用是等检测到下载框就关闭他同时关闭这个messagebox

public void ShowObj(WebBrowser webBrowser, int kcp)
        {
            //////////////String ss = "";
            HtmlElementCollection obj = webBrowser.Document.GetElementsByTagName("IMG");
            mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);
            mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
            mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);

            for (int i = 0; i < obj.Count; i++)
            {
                if (obj[i].GetAttribute("src") == "http://km.sgcc.com.cn:8080/km/images/icons/download.gif")
                {
                    if (obj[i].Parent.TagName == "A") 
                    {
                        String times = obj[i].Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.FirstChild.FirstChild.Children[2].FirstChild.FirstChild.FirstChild.Children[1].OuterText.Trim();
                        String years = times.Substring(0, 4);
                        int yeari = Int32.Parse(years);
                        String months = times.Substring(5, 2);
                        int monthi = Int32.Parse(months);
                        String days = times.Substring(8, 2);
                        int dayi = Int32.Parse(days);
DateTime dt = new DateTime(yeari, monthi, dayi);
                        if (dt > startDT && dt < endDT)
                        {
                            // System.Threading.Thread.Sleep(10000);
                            // MessageBox.Show("danji");
                            Program.mf.cf.f8 = 0;
                            mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
                            
                            if (kcp > 1)
                            {
                                obj[i].Parent.Click += new HtmlElementEventHandler(Parent_Click);
                                obj[i].Parent.InvokeMember("click");
                                System.Threading.Thread.Sleep(100);
                                //MessageBox.Show(obj[i].Parent.OuterHtml+Environment.NewLine+Environment.NewLine+
                                    //"等待文件下载框弹出,并自动关闭", "下载等待");
                            }
                            else
                            {
                                obj[i].Parent.Click += new HtmlElementEventHandler(Parent_Click);
                                obj[i].Parent.InvokeMember("click");
                                //MessageBox.Show(obj[i].Parent.OuterHtml + Environment.NewLine + Environment.NewLine +
                                    //"等待文件下载框弹出,并自动关闭", "下载等待");
                            }
                            //MessageBox.Show(times,"时间");
                            //mbf.textBoxMessage.AppendText(times + Environment.NewLine);
                            ////////ss += "\"" + times + Environment.NewLine + Environment.NewLine;
                        }
                    }
                }
            }
            Program.mf.cf.f8 = -1;
        }
        void Parent_Click(object sender, HtmlElementEventArgs e) { MessageBox.Show("等待文件下载框弹出,并自动关闭", "下载等待"); }

网页开始在第一页,执行上面这个操作后,就模拟点击第二页,然后再执行同样的操作,代码在下面
使用outerhtml检测的html是对的,并且上面方法的左后一句的方法也检测到了单击事件,然后问题就出来了

//////////////////////////////////////////////////////////////////////page 1
                ShowObj(webBrowserMain, 1);
                //////////////////////////////////////////////////////////////////////page next

                HtmlElement nextPage = webBrowserMain.Document.GetElementById("setpage");

                while (nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].TagName == "A" && nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].InnerText == "下一页")
                {
                    nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].InvokeMember("click");
                    pcon++;
                    cf.f4 = 0;
                    MessageBox.Show("正在打开第" + pcon + "页,请稍后……", "第" + pcon + "页");
                    ShowObj(webBrowserMain, pcon);
                    nextPage = webBrowserMain.Document.GetElementById("setpage");

                }


控制代码:

void timerConfig_Tick(object sender, EventArgs e)
        {

if (f8 == 0)
            {
                Program.mf.mbf.textBoxMessage.AppendText("等待下载框弹出……" + Environment.NewLine);
                
                IntPtr ptr = FindWindow(null, "文件下载");
                if (ptr != IntPtr.Zero)
                {
                    System.Threading.Thread.Sleep(100);
                    PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                    //IntPtr ptr1 = FindWindow(null, "下载等待");
                    //if (ptr1 != IntPtr.Zero)
                    //{
                    //    PostMessage(ptr1, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                    //}
                    //StartKiller(100, "下载等待");
                    f8 = 1;
                    f9 = 0;
                    Program.mf.mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
                }
            }
}
c# webbrowser InvokeMember --------------------编程问答-------------------- 网站属于内网不太好发……只能让你们看看程序了……上面是部分代码,要是你们看不明白,我再发全代码
总之现在这问题我快疯了…… --------------------编程问答-------------------- 说明那一行是异步的,直接执行下面的,上面的结果还没有出来。断点的话,已经执行出来了。 --------------------编程问答-------------------- “网页开始在第一页,执行上面这个操作后,就模拟点击第二页,然后再执行同样的操作......”

程序将网页导航到第二页,就应该立刻结束了。然后,等到你的 webBrowser 触发 DocumentCompleted 事件,并且当它的 ReadyState 属性为 WebBrowserReadyState.Complete 时,才能执行 ShowObj(webBrowserMain, pcon) --------------------编程问答-------------------- 帮忙顶下,希望可以帮我看看我的帖子,谢谢了
http://bbs.csdn.net/topics/390651035  --------------------编程问答-------------------- 给你写个捕获事件的例子:
WebBrowserDocumentCompletedEventHandler proc1 = null;
WebBrowserDocumentCompletedEventHandler proc2 = null;
proc1 = new WebBrowserDocumentCompletedEventHandler((sender, e) =>
    {
        if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            this.webBrowser1.DocumentCompleted -= proc1;
            this.webBrowser1.DocumentCompleted += proc2;
            this.webBrowser1.Navigate("http://bbs.csdn.net/topics/390650774");
        }
    });
proc2 = new WebBrowserDocumentCompletedEventHandler((sender, e) =>
{
    if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        this.webBrowser1.DocumentCompleted -= proc2;
        this.webBrowser1.Navigate("http://bbs.csdn.net/topics/390651044");
    }
});
this.webBrowser1.DocumentCompleted += proc1;
this.webBrowser1.Navigate("http://bbs.csdn.net/");


这里,等google页面真正完全加载完毕,才会导航到第二个页面。同样地,等完全加载完毕,才会去执行proc2。

当页面还有某些内容没有下载完毕(例如某个js文件、某个图片),则不会向下执行。 --------------------编程问答-------------------- 如果会写代码
var a=1;
var b= a+1;

这种顺序执行的代码,可能每一个人都会写。这没有什么门槛。

但是如果现实需要你对程序执行环境知识的理解稍微复杂一点,这就需要学习了。 --------------------编程问答-------------------- 其实代码是一回事,思路更重要。

一看到你写的 while 循环结构中间的那几句,就知道有问题了。触发Click按键操作之后,你的程序就应该结束了。然后等浏览器通知你“下载完毕”之后再去继续处理。 --------------------编程问答-------------------- 如果单步是正确的,但是连续执行会出错,那你可以在中间加个断点,在这个断点停留几秒钟再继续执行,如果正确了,就证明是程序需要时间下载或处理数据。需要把出错的代码段放到完成下载的事件上去 --------------------编程问答-------------------- 除
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,