C# Webbrowser 常用方法及多线程调用

时间:2022-10-26 09:30:44

设置控件的值

        /// <summary>
        /// 根据ID,NAME双重判断并设置值
        /// </summary>
        /// <param name="tagName"></param>
        /// <param name="id"></param>
        /// <param name="value"></param>
        private void SetTxt(string tagName, string name, string id, string value)
        {
            HtmlDocument docx = <strong><font color=.Document;
            foreach (HtmlElement item in docx.GetElementsByTagName(tagName))
            {

                if (item.GetAttribute("name") != null && item.GetAttribute("name") == name || item.Id == id)
                {
                    try
                    {
                        item.Focus();
                        item.SetAttribute("value", value);
                    }
                    catch
                    {
                        item.SetAttribute("value", value);
                    }

                }
            }
        }

返回指定WebBrowser中图片<IMG></IMG>中的图内容   需要引用MsHtml

/// <summary>
/// 返回指定WebBrowser中图片<IMG></IMG>中的图内容
/// </summary>
/// <param name="WebCtl">WebBrowser控件</param>
/// <param name="ImgeTag">IMG元素</param>
/// <returns>IMG对象</returns>
private Image GetWebImage(WebBrowser WebCtl, HtmlElement ImgeTag)
{
    HTMLDocument doc = (HTMLDocument)WebCtl.Document.DomDocument;
    HTMLBody body = (HTMLBody)doc.body;
    IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();
    IHTMLControlElement Img = (IHTMLControlElement)ImgeTag.DomElement; //图片地址
    Image oldImage = Clipboard.GetImage();
    rang.add(Img);
    rang.execCommand("Copy", false, null);  //拷贝到内存
    Image numImage = Clipboard.GetImage();
    try
    {
        Clipboard.SetImage(oldImage);
    }
    catch { }
    return numImage;
}

一个通用webbrowser类,封装常用方法

public partial class htmlElement
    {
        //根据Name获取元素
        public HtmlElement GetElement_Name(WebBrowser wb, string Name)
        {
            HtmlElement e = wb.Document.All[Name];
            return e;
        }

        //根据Id获取元素
        public HtmlElement GetElement_Id(WebBrowser wb, string id)
        {
            HtmlElement e = wb.Document.GetElementById(id);
            return e;
        }

        //根据Index获取元素
        public HtmlElement GetElement_Index(WebBrowser wb, int index)
        {
            HtmlElement e = wb.Document.All[index];
            return e;
        }

        // 据Type获取元 ,在没有NAME和ID的情况下使用
        public HtmlElement GetElement_Type(WebBrowser wb, string type)
        {
            HtmlElement e = null;
            HtmlElementCollection elements = wb.Document.GetElementsByTagName("input");
            foreach (HtmlElement element in elements)
            {
                if (element.GetAttribute("type") == type)
                {
                    e = element;
                }
            }
            return e;
        }
        // 据Type获取元 ,在没有NAME和ID的情况下使用,并指定是同类type的第 个,GetElement_Type()升级版
        public HtmlElement GetElement_Type_No(WebBrowser wb, string type, int i)
        {
            ;
            HtmlElement e = null;
            HtmlElementCollection elements = wb.Document.GetElementsByTagName("input");
            foreach (HtmlElement element in elements)
            {
                if (element.GetAttribute("type") == type)
                {
                    if (j == i)
                    {
                        e = element;
                    }
                    j++;
                }
            }
            return e;
        }
        //获取form表单名name,返回表单
        public HtmlElement GetElement_Form(WebBrowser wb, string form_name)
        {
            HtmlElement e = wb.Document.Forms[form_name];
            return e;
        }

        //设置元素value属性的值
        public void Write_value(HtmlElement e, string value)
        {
            e.SetAttribute("value", value);
        }

        //执行元素的方法,如:click,submit(需Form表单名)等
        public void Btn_click(HtmlElement e, string s)
        {

            e.InvokeMember(s);
        }
    }

多线程执行webbrowser的方法:
webbrowser 只支持STA模式

private void ThreadWebBrowser(string url)
{
   Thread tread = new Thread(new ParameterizedThreadStart(BeginCatch));
   tread.SetApartmentState(ApartmentState.STA);//注意创建的线程单元
   tread.Start(url);
}

private void BeginCatch(object obj)
{
     string url = obj.ToString();
     WebBrowser wb = new WebBrowser();
     wb.ScriptErrorsSuppressed = true;
     //在这里Navigate一个空白页面 必须
     wb.Navigate("about:blank");
     string htmlcode = "";//这里赋值 HTML字符串数据
     wb.Document.Write(htmlcode);
     //执行其他操作
}

C# Webbrowser 常用方法及多线程调用的更多相关文章

  1. dump、libeay32&period;dll、gsoap、webserver多线程调用gsoap产生崩溃

    问题:调用webserver接口出现dump文件,dump文件指向libeay32.dll有问题,产生崩溃的原因是gsoap多线程问题,多线程调用时需要程序启动的地方调用如下函数进行多线程初始化: i ...

  2. C&num; 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的

    C#  多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的 using System;using System.Threading;using System.Threading. ...

  3. C&num; winForm webBrowser页面中js调用winForm类方法&lpar;转&rpar;

      有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部:   1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...

  4. 【转】 Pro Android学习笔记(七一):HTTP服务(5):多线程调用HttpClient

    目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修 ...

  5. 多线程调用有参数的方法---c&num; Thread 与 Task

    C#实现多线程的方式:Task——任务   简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完 ...

  6. Tess4j&sol;Tess4j 多线程调用 过程中报错问题记录 Invalid memory access

    最近使用 Tess4j 做一些 OCR图片文字识别的代码. 然后想当然的将这个 ITesseract ocr_robot = new Tesseract(); 作为了工具类做成了成员变量. 当多线程调 ...

  7. delphi中WEBBrowser网页html相互调用(一)

    1.基本操作1.1.激活 var doc,url:Olevariant ; begin url:='about:blank' ;//或者一个有实际意义的url WebBrowser1.Navigate ...

  8. C&num; WebBrowser&period;DocumentCompleted 多次调用解决方法

    大概出现了以下几种情况. 1.WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complet ...

  9. C&num; 使用委托实现多线程调用窗体的四种方式

    1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...

随机推荐

  1. HTML标记语言篇--学习笔记01

    HTML标记语言篇 第1章  HTML基础 1.1 基本概念 WWW 是"World Wide Web"(全球广域网)的缩写,简称为Web,中文又称为"万维网" ...

  2. Android深度探索--HAL与驱动开发----第一章读书笔记

    1. Android的系统架构有四层,它的发展目前来说 是比较成熟的,流行于目前的市场.其架构包括四层(linux内核.C/C++代码库.Android SDK API.应用程序). 2. 驱动是直接 ...

  3. 解决SVN不显示状态图标

    打开注册表,找到"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlay ...

  4. TextBox

    一.聚焦: private void FrmOnlineChargeMoney_Paint(object sender, PaintEventArgs e) { edtAuthCode.SelectA ...

  5. PHPExcel融入ZF2

    下载PHPExcel至vendor下一个 在public\index.php加拿大 require './vendor/Classes/PHPExcel.php'; 之后就能够在不论什么地方按例如以下 ...

  6. &lbrack;题解&rsqb;图的m着色问题

    图的m着色问题(color) [题目描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...

  7. redis&lowbar;哈希对象

    redis哈希对象的底层编码有两种:ziplist.hashtable ziplist编码 当一个哈希键只包含少量kv对.且key和value都是小整数值.短字符串时,redis会使用压缩列表来做 z ...

  8. Excel2007VBA数组和工作表及单元格的引用

    动态数组使用: https://zhidao.baidu.com/question/1432222709706721499.html 使用Redim动态数组即可. 1 2 3 4 5 6 7 8 Su ...

  9. codeforce 459 DIV2 D题

    题意   在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...

  10. NHibernate使用总结&lpar;2&rpar;

    首先,映射文件的名称一定要是XXX.hbm.xml且生成方式一定要是嵌入的资源+不复制. hibernate.cfg.xml这个文件要放在根目录下,且生成方式必须是内容+始终复制. private v ...