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

设置控件的值

        /// <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="#FF0000">webBrowser</font></strong>1.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)
        {
            int j = 1;
            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);
     //执行其他操作
}
时间: 2024-10-27 13:26:37

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

NDK使用技巧、多线程调用注意、ndk中的工具使用

//NDK 使用技巧和多线程调用注意 //http://www.ibm.com/search/csass/search/?q=ndk&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh void demo(JNIEnv* env, jobject thiz) { //这JNI接口指针可以存储,但只在当前线程仍然是有效的. /* A JNI environment pointer (JNIEnv*) is

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

目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修改HTTP连接的参数 使用共同的Appcliation对象 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 应用共享HttpClient对象的同步问题 在之前的例子中,HttpClient只

多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用Procedure_insert Procedure_insert Begin Call procedure(获取流水号) Insert into table values(流水号作为id,其他列); End 流水号存储过程: Update 统计表 统计字段+1 Update 统计表 最终流水号 s

delphi webbrowser 常用方法示例

var Form : IHTMLFormElement ; D:IHTMLDocument2 ; begin with WebBrowser1 do begin D := Document as IHTMLDocument2; Form := D.Forms.item( 'form1 ',0) as IHTMLFormElement; //form1为表单名 //title为表单中的文本框 (form.item( 'title ',0) as IHTMLElement).setAttribute

ArrayList在多线程调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)

最近在看<实战Java虚拟机>一书,看到有关锁与并发章节时,看到如下一个多线程使用ArrayList的例子: 两个线程t1和t2同时向numberList中添加数据,由于ArrayList是线程不安全的,因此会导致添加的数据有错误,这个我还是能理解的,但是它报的确是如下错误: 我就有点理解不了了,ArrayList不是自动扩容.没有长度限制吗,为什么还会出现数组下标越界这种错误呢? 为了便于分析,我对代码进行了一点点修改: 执行结果为: 有时还会出现null, 带着种种不解,来看ArrayLi

多线程调用COM组件的体会(CoInitialize)(转)

原文转自 https://www.cnblogs.com/manors/archive/2010/05/17/COM_Initialize_STA_MTA.html 与设备打交道时,我们经常用到COM组件,比如音视频设备(麦克风.播放器.摄像头等). 调用任何COM组件之前,你必须首先初始化COM套件环境,即调用CoInitialize或CoInitializeEx.COM套件环境在线程的生存周期内有效,线程退出前需要调用CoUninitialize释放COM套件. 所谓COM套件,实际上是微软

多线程调用同一个方法,局部变量会共享吗

对于一个局部变量应该是各线程独立的,一个线程不会改变另一个线程的临时变量. 多线程时, 几个线程间输出信息是交叉在一起的, 但你又没有区分是哪个线程输出的, 所以你自己就误认为是同一个线程输出的东西被改变了.  实际上是你自己的理解错误. 所有线程都用cout输出内容,你如何判断哪些内容是哪个线程输出的,而且cout是一个全局变量,多线程同时访问需要加锁,否则会出现一些莫名其妙的情况 结论: 局部变量是不会被修改的,而全局变量则很容易就被修改了,而你却还不知道. ////////////////

PHP单线程和多线程调用

<?php //curl_multi_init() session_start(); $url = 'http://localhost.huawei.com:8060/ecommunity/index.php?app=admin&mod=DataMove&act=moveData_share'; $ch = curl_init();  curl_setopt ($ch, CURLOPT_URL, $url);  curl_setopt($ch, CURLOPT_USERAGENT,

多线程 调用多线程的方法 Runtime与ProcessBuilder

一般我们使用Java运行其他类中的方法的时候,无论是静态调用还是动态调用,都是在当前的进程中执行的.也就是只有一个Java虚拟机实例在运行.有时候需要通过Java代码启动多个Java子进程,这样做会消耗些资源,但是程序变得更稳定.因为新启动的进程是在不同的虚拟机中运行的. 在Windows中,一个虚拟机就是一个 有两种方式调用一个进程 1.System.exec 子进程: 1 package org.zln.thread; 2 3 import java.io.File; 4 import ja