<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[kiyeer's blog]]></title>
  <subtitle type="html"><![CDATA[生命在于折腾；]]></subtitle>
  <id>http://www.kiyeer.net/</id>
  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.kiyeer.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2011-09-14T15:05:18+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[使用DD_belatedPNG让IE6支持PNG透明图片]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=3" label="Web设计/Jquery" /> 
	  <updated>2011-09-14T15:05:18+08:00</updated>
	  <published>2011-09-14T15:05:18+08:00</published>
		  <summary type="html"><![CDATA[众所周知IE6不支持透明的PNG图片,而PNG图片在Web设计方面表现力上，具有其它图形格式所达不到的效果，IE6这一致命缺陷极大地限制了Web设计的创意发挥。虽然解决IE6的透明PNG的方法也很多,从使用IE特有的滤镜或是e­xpression,再到javascri&#112;t+透明 GIF替代.但是这些方法都有一个缺点,就是不支持CSS中backgrond-position与background-repeat属性。而使用DD_belatedPNG.js可完美的解决IE6下PNG图片透明问题，并且支持backgrond-position与background-repeat. 这是其他方法所不具备的，同时DD_belatedPNG还支持a:hover属性,以及&lt;img&gt;。<br/><br/>使用方法：<br/>首先下载JS文件<br/><br/>0.0.8a-min.js (压缩版)<br/><br/>英文说明<br/><br/>之后在页面中引用代码：<br/><br/>&lt;!–[if IE 6]&gt;<br/>&lt;script type=”text/javascri&#112;t” src=”下载下来的JS路径”&gt;&lt;/script&gt;<br/>&lt;script&gt;<br/>DD_belatedPNG.fix(‘CSS选择器, 应用类型’);<br/>&lt;/script&gt;<br/>&lt;![endif]–&gt;<br/>引用函数是 DD_belatedPNG.fix() , 括号里分别填写应用PNG的CSS选择器（可使用ID选择器和类选择器）和应用类型（分为img和background两种）。<br/><br/>如DD_belatedPNG.fix(‘#box-one, img’) 或者 DD_belatedPNG.fix(‘.header, background’) 等。<br/><br/>这些可以简写成 DD_belatedPNG.fix(‘#box-one, .header, img,background’);&nbsp;&nbsp;。<br/><br/>更多选择器的如 DD_belatedPNG.fix(‘#box-one, .header,#footer,.box-two a:hover, img,background’);&nbsp;&nbsp;等等。<br/><br/>另外，为解决IE6下背景图闪烁，可以在页面中添加如下脚本<br/><br/>&lt;!–[if IE 6]&gt;<br/>&lt;script type=”text/javascri&#112;t”&gt;<br/>// &lt;![CDATA[<br/>if((window.navigator.appName.toUpperCase().indexOf(&#34;MICROSOFT&#34;)&gt;=0)&amp;&amp;(document.execCommand))<br/>try{<br/>document.execCommand(&#34;BackgroundImageCache&#34;, false, true);<br/>}<br/>catch(e){}<br/>// ]]&gt;<br/>&lt;/script&gt;<br/><span id="down_bnoyremxto"></span><script language="javascript" type="text/javascript">doAjax('?action=Antidown&id=2&downurl=download%2Easp%3Fid%3D2&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E6%96%87%E4%BB%B6','down_bnoyremxto');</script><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=873" /> 
	  <id>http://www.kiyeer.net/default.asp?id=873</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[关于nvelocity中null值的判断]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=2" label="Asp.Net/Vb/C#" /> 
	  <updated>2011-07-11T20:43:22+08:00</updated>
	  <published>2011-07-11T20:43:22+08:00</published>
		  <summary type="html"><![CDATA[这一段时间一直在写简历下载的功能。遇到的一个问题是：有一个变量保存的是文本简历的内容，但是不是每份简历中都有这个信息，断点调试会发现，这个变量显示的可能是null。这就麻烦了，在nvelocity中，我还不知道怎么判断null值。在网上搜了下，找到了很好的解决办法。现在，把这个办法贴出来。嘿嘿。<br/>&nbsp;&nbsp;<br/>原文链接地址：<a href="http://blog.sina.com.cn/s/blog_4b01279a0100hc6o.html" target="_blank" rel="external">http://blog.sina.com.cn/s/blog_4b01279a0100hc6o.html</a><br/> <br/>Velocity中如何判断null(2010-03-14 16:42:10)<br/><br/>今天，在对我的兼职网进行静态化改造的时候，用到了Velocity。<br/>在写模版文件判断数据是否为空的时候，想当然的写成了下面的代码。<br/>#if(${data} != null)<br/> <br/>&nbsp;&nbsp; ...<br/>#end<br/><br/>结果Velocity解析时抛出了如下错误：<br/>Caused by: o&#114;g.apache.velocity.exception.ParseErrorException: Encountered &#34;null&#34; at generator file[line 7, column 27]<br/>一查Velocity的语法说明，原来Velocity判断null和java是不一样的。<br/>总统上说，判断是否为null有下面几种方法：<br/>&nbsp;&nbsp;&nbsp;&nbsp;1. #if (! $foo) 判断$foo为空，判断非空为 #if ($foo)<br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 使用 #ifnull() 或 #ifnotnull()<br/>&nbsp;&nbsp;&nbsp;&nbsp;#ifnull ($foo)<br/>&nbsp;&nbsp;&nbsp;&nbsp;要使用这个特性必须在velocity.properties文件中加入：<br/>userdirective = o&#114;g.apache.velocity.tools.generic.directive.Ifnull<br/>userdirective = o&#114;g.apache.velocity.tools.generic.directive.Ifnotnull<br/>&nbsp;&nbsp;&nbsp;&nbsp;3. 使用null工具判断<br/>&nbsp;&nbsp;&nbsp;&nbsp;#if($null.isNull($foo))<br/>&nbsp;&nbsp;&nbsp;&nbsp;注意这种方式特别有用，尤其你在需要这个判断作为一个判断字句时，比如我要你判断一个集合为null或为空时只能使用这种方式了：<br/>&nbsp;&nbsp;&nbsp;&nbsp;$if ($null.isNull($mycoll) || $mycoll.size()==0)]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=872" /> 
	  <id>http://www.kiyeer.net/default.asp?id=872</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[kiyeer]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=8" label="乱七八糟" /> 
	  <updated>2011-06-19T20:56:27+08:00</updated>
	  <published>2011-06-19T20:56:27+08:00</published>
		  <summary type="html"><![CDATA[A2SD是Application To SDCard的缩写，它能实现将APK安装到SD卡，这之前有一些前提条件和注意事项：<br/>操作步骤：<br/>1.开机<br/>按住电源键不放直到出现菜单，按音量键选择 <br/>&#34;Boot AD SD&#34;，按拨号键确认<br/>2.选择：advance --&gt; partition sd --&gt; ext --&gt; 1024 --&gt;256。<br/>这样就会在SD卡创建一个1G大小的 ext3分区和一个256M的swap。<br/><br/>第二步：开启A2SD+<br/>第一步只是支持A2SD+，但是你发现你装的软件还是装在系统内存里的，A2SD+的可用空间还是1G，需要进行下面的步骤才能完全使用A2SD+。到MIUI系统自带的“MIUI网盘”下载“终端模拟器”这个程序，安装运行后输入以下命令：<br/>su 回车<br/>a2sd reinstall 回车<br/>手机自动重启<br/><br/>重启后继续进入终端模拟器运行以下命令<br/>su 回车<br/>a2sd zipalign 回车<br/>a2sd cachesd 回车 手机自动重启，搞定，开始爽吧!<br/>对于进阶使用者我还推荐使用以下命令<br/>a2sd help<br/>列出所有命令说明<br/>a2sd reinstall<br/>安装或者重装a2sd,如果上述check不正常可以从超级终端执行<br/>a2sd lowmem-optimum<br/>详见a2sd帮助的Low Memory Killer Commands部分，a2sd 2.7.5一大特色是能配置内存策略，就不用再装内存管理软件了，optimum是我认为最合适的一项。强烈推荐使用，装上后，就不用装其他的内存管理软件了<br/>a2sd zipalign<br/>详见a2sd帮助的ZipAlign Commands部分，据说这个参数能让apk的访问速度稍微加快。<br/>*a2sd cachesd<br/>详见a2sd帮助的Dalvik Cache Commands部分，这个参数能把缓存也放入SD卡，官方推荐如果是CLASS4或者以上的SD卡推荐使用，否则可能速度更慢！这么做过后机载的app空间几乎不会消耗 undefined<br/>详见Apps2SD Diagnostic Commands部分，在作者发布页的回帖中，我总结了一条经验，用过任何a2sd命令后 执行一次a2sd repair，能有效的预防一些不可预知的负面情况。我个人推荐每次更新软件后 和 备份前 能想起来的话就执行一次这条命令，小心使得万年船。4 t0 G;<br/>常见问题问答<br/>Q：分区时的swap是什么，swap和ext各应该设置多大？<br/>A：默认值(32 &amp; 512)即可，这些DIY的Recovery是给目标机型量身定做的，大侠们已经将最合适的值作为默认。swap分区的作用是把部分内存数据或热代码存入这个分区 可以让内存某程度上更多空余 和提高一些软件的执行效率，类似于Windows的虚拟内存和boostr。但用在手机的和PC的Linux不太一样，swap过大会卡机甚至频繁出现FC，和内存相比 SD卡的带宽小了几百倍，它对一些频繁存取的系统数据来说太慢了，如果过**例的内存数据被置于SD的swap分区 前面的情况就会发生。<br/>Q：为何A2SD启用后，安装程序仍会减少机载空间？<br/>A：安装的软件会在/data目录下产生 配置文件 缓存文件 Dalvik Cache 或数据库文件等。例举我的情况：新装系统剩余100M空间，装软件到空间不足警告(低于16M)，启用A2SD后装同样多的软件 ROM的可用空间还有60多M。A2SD是有积极作用的undefined。<br/>如果启用A2SD后空间又用超了，可以使用a2sd cachesd命令 能又给你腾出80MB左右空间出来undefined。但是需要注意：移动Dalvik Cache到EXT分区可能会让程序响应变慢，特别是卡速度不够快的话(卡标的Class不要管 关键要看实测速度，写入不达10M/s读取不达15M/s的TF卡不推荐启用cachesd功能 会感觉到软件启动时间变长了)。<br/>Q：启用A2SD后我还能用磁盘模式访问SD卡吗？<br/>A：能的，就和平时一样用，系统只会umount FAT分区分配给USB。但是不能把SD卡拔掉～<br/>Q：不想用A2SD了该咋办？<br/>A：用adb shell执行a2sd&nbsp;&nbsp;remove。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=871" /> 
	  <id>http://www.kiyeer.net/default.asp?id=871</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[转载：c# sqlite 数据库加密]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=4" label="数据库" /> 
	  <updated>2011-03-25T14:43:27+08:00</updated>
	  <published>2011-03-25T14:43:27+08:00</published>
		  <summary type="html"><![CDATA[用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。<br/>有关c#代码如下：<br/>1、创建空的sqlite数据库。 //数据库名的后缀你可以直接指定，甚至没有后缀都可以<br/>//方法一：创建一个空sqlite数据库，用IO的方式<br/>FileStream fs = File.Cr&#101;ate(“c:\\test.db“);<br/>//方法二：用SQLiteConnection<br/>SQLiteConnection.Cr&#101;ateFile(“c:\\test.db“); <br/><br/>创建的数据库是个0字节的文件。<br/><br/>2、创建加密的空sqlite数据库<br/><br/>//创建一个密码为password的空的sqlite数据库<br/>SQLiteConnection.Cr&#101;ateFile（“c:\\test2.db“);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test2.db“);<br/>SQLiteConnection cnn = new SQLiteConnection(“Data Source=D:\\test2.db“);<br/>cnn.Open();<br/>cnn.ChangePassword(“password“);<br/>3、给未加密的数据库加密<br/><br/>SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test.db“);<br/>cnn.Open();<br/>cnn.ChangePassword(“password“);<br/>4、打开加密sqlite数据库<br/><br/>//方法一<br/>SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test2.db“);<br/>cnn.SetPassword(“password“);<br/>cnn.Open();<br/>//方法二<br/>SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();<br/>builder.DataSource = @”c:\test.db“;<br/>builder.Password = @”password“;<br/>SQLiteConnection cnn = new SQLiteConnection(builder.ConnectionString);<br/>cnn .Open();<br/><br/>注：<br/>A、因为加密的函数是利用windows api，故加密后的数据库只能适用在windows平台，加密的方式是整体文件加密。<br/>B、加密的算法是RC4，如果你想采用别的加密算法来加密，请参考ADO.NET 2.0 SQLite Data Provider 的源码来修改。<br/>c、相关sqlite数据库操作类似ADO.NET 2.0。详见ADO.NET 2.0 SQLite Data Provider的帮助文档。<br/>c、ADO.NET 2.0 SQLite Data Provider 版本为：1.0.53.0 ，SQLite版本 : 3.6.0。<br/>d、开发环境为vs2008。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=870" /> 
	  <id>http://www.kiyeer.net/default.asp?id=870</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[安装VS2010 SP1提示安装时发生严重错误的解决方法]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=2" label="Asp.Net/Vb/C#" /> 
	  <updated>2011-03-10T09:28:42+08:00</updated>
	  <published>2011-03-10T09:28:42+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;昨天在cnbeta上看到微软发布的VS2010 SP1，很兴奋，第一时间下载了，然后安装，结果提示发生了安装时发生严重错误，真是打击啊，由于刚发布，网上搜索没有解决办法，只能自己摸索了。看了一下具体的错误提示：</p>
<blockquote>
<p><span class="act">
<div class="section" style="margin-left: 0.8em; "><span class="act">
<div class="section" style="margin-left: 0.8em; "><span class="act">
<div class="section" style="margin-left: 0.8em; "><span class="r" style="font-size: 14px; font-weight: bolder; display: inline; ">Exe (G:\vs2010_sp1_10.0.40219.1_chs\SetupUtility.exe) succeeded.<br />
</span><span class="r" style="font-size: 14px; font-weight: bolder; display: inline; ">Exe Log File:&nbsp;<a href="http://www.kiyeer.net/file:///C:/Users/ADMINI~1/AppData/Local/Temp/dd_SetupUtility.txt" style="text-decoration: none; color: rgb(0, 0, 255); ">dd_SetupUtility.txt</a><br />
</span></div>
</span><span class="act">
<div class="section" style="margin-left: 0.8em; "><span class="r" style="font-size: 14px; font-weight: bolder; display: inline; ">MSI (G:\vs2010_sp1_10.0.40219.1_chs\VS10sp1_x86.msi) Installation failed. Msi Log:&nbsp;<a href="http://www.kiyeer.net/file:///C:/Users/ADMINI~1/AppData/Local/Temp/Microsoft%20Visual%20Studio%202010%20Service%20Pack%201_20110310_085524852-MSI_VS10sp1_x86.msi.txt" style="text-decoration: none; color: rgb(0, 0, 255); ">Microsoft Visual Studio 2010 Service Pack 1_20110310_085524852-MSI_VS10sp1_x86.msi.txt</a><br />
</span></div>
</span><span class="act">
<div class="section" style="margin-left: 0.8em; ">&nbsp;</div>
</span></div>
</span></div>
</span><span class="r" style="font-size: 14px; font-weight: bolder; display: inline; ">Final Result: Installation failed with error code: (0x80070643), &quot;安装时发生严重错误 &quot; (Elapsed time: 0 00:01:53).</span></p>
</blockquote>
<p>看最下面一行，是VS10sp1_x86.msi这个文件安装时出错了。于是我单独安装这个文件，发现提示缺少文件(缺少1028下找不eula.rtf这个文件，安装包中根本没有这个文件夹，只有2052下有，于是我把整个2052文件夹复制下来并重命名成1028，接着又提示1031下缺少eula.rtf，用同样的方法，反正共9个这样的提示，都按这个方法就行可了。)估计是缺少语言文件吧。</p>
<p>我把缺少的打包，解压到安装目录即可：</p>
<p><a href="http://www.kiyeer.net/download.asp?id=1"><img border="0" alt="" style="margin:0px 2px -4px 0px" src="http://www.kiyeer.net/images/download.gif" />点击下载此文件</a></p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=869" /> 
	  <id>http://www.kiyeer.net/default.asp?id=869</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[.Net 2.0实例学习：WebBrowser页面与WinForm交互技巧]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=2" label="Asp.Net/Vb/C#" /> 
	  <updated>2010-05-13T10:54:48+08:00</updated>
	  <published>2010-05-13T10:54:48+08:00</published>
		  <summary type="html"><![CDATA[<p>最近看到博客园入门教学文章比较流行，自己最近又偷懒比较多，没啥心得，不妨写一篇没啥深度的入门文章吧。</p>
<p>话说有了WebBrowser类，终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器，那就太没意思了（还不如直接用IE呢）。那么，无论我们是想做一个&ldquo;定制版IE&rdquo;，还是希望利用HTML来做用户界面（指WinApp而非WebApp。许多单机软件，包括Windows的帮助支持中心，都是HTML做的），都少不了Windows Form和包含在WebBrowser中的Web页面的交互。本文将通过几个实际的例子，初步介绍一下WinForm和WebBrowser所包含的Web页面之间的交互。</p>
<p>下面的代码假设你已经建立了一个Windows Form，上面有一个WebBrowser名为&ldquo;webBrowser&rdquo;。</p>
<p><strong style="color: #0000ff">Study Case 1：用WinForm的Event Handler响应Web页面的事件</strong></p>
<p>现在有这样一个Windows Application，它的界面上只有一个WebBrowser，显示一个本地的HTML文件作为界面。现在的问题是，所有逻辑都可以放在HTML文件里，唯独&ldquo;关闭&rdquo;按钮遇到了困难&mdash;&mdash;通常，Web页面是没有办法直接控制浏览器的，更不用说结束这个WinForm程序了。</p>
<p>但是，在.Net 2.0当中，&ldquo;由Windows Form响应Web页面的事件&rdquo;已经成为了现实。</p>
<p>在.Net 2.0中，整个HTML文档以及其包含的各个HTML元素，都和一个个HtmlDocument、HtmlElement之类的.Net对象对应。因此只要找到这个&ldquo;关闭&rdquo;按钮对应的HtmlElement对象，为其click事件添加Event Handler即可。 <br />
<br />
假设HTML源代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></font><font size="2"><span style="color: #000000"> <br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span></font><font size="2"><span style="color: #000000"> <br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=&quot;button&quot;</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">=&quot;btnClose&quot;</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">=&quot;关闭&quot;</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></font><font size="2"><span style="color: #000000"> <br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span></font><font size="2"><span style="color: #000000"> <br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></font></div>
<p>那么找出该按钮并为之添加Event Handler的代码如下： <br />
&nbsp;</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">HtmlDocument&nbsp;htmlDoc&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;webBrowser.Document; <br />
HtmlElement&nbsp;btnElement&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;htmlDoc.All[</span><span style="color: #000000">&quot;</span><span style="color: #000000">btnClose</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">]; <br />
</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(btnElement&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span></font><font size="2"><span style="color: #000000">) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;btnElement.click&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></font><span style="color: #000000"><font size="2">&nbsp;HtmlElementEventHandler(HtmlBtnClose_Click); <br />
} <br />
</font></span></div>
<p>其中HtmlBtnClose_Click是按下Web按钮时的Event Handler。</p>
<p>很简单吧？那么稍稍高级一点的&mdash;&mdash;我们都知道一个HTML元素可能有很多各种各样的事件，而HtmlElement这个类只给出最常用、共通的几个。那么，如何响应其他事件呢？这也很简单，只需要调用HtmlElement的AttachEventHandler就可以了：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">btnElement.AttachEventHandler(</span><span style="color: #000000">&quot;</span><span style="color: #000000">onclick</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span></font><font size="2"><span style="color: #000000">&nbsp;EventHandler(HtmlBtnClose_Click));&nbsp; <br />
</span><span style="color: #008000">//</span><span style="color: #008000">这一句等价于上面的btnElement.click&nbsp;+=&nbsp;new&nbsp;HtmlElementEventHandler(HtmlBtnClose_Click);&nbsp;</span></font></div>
<p>对于其他事件，把&quot;onclick&quot;换成该事件的名字就可以了。例如：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">formElement.AttachEventHandler(</span><span style="color: #000000">&quot;</span><span style="color: #000000">onsubmit</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EventHandler(HtmlForm_Submit));&nbsp;</span></font></div>
<p><br />
<strong><span style="color: #0000ff"><strong>Study Case 2：表单（form）的自动填写和提交</strong> </span></strong><br />
<br />
要使我们的WebBrowser具有自动填表、甚至自动提交的功能，并不困难。</p>
<p>假设有一个最简单的登录页面，输入用户名密码，点&ldquo;登录&rdquo;按钮即可登录。已知用户名输入框的id（或Name，下同）是username，密码输入框的id是password，&ldquo;登录&rdquo;按钮的id是submitbutton，那么我们只需要在webBrowser的DocumentCompleted事件中使用下面的代码即可：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">HtmlElement&nbsp;btnSubmit&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;webBrowser.Document.All[</span><span style="color: #000000">&quot;</span><span style="color: #000000">submitbutton</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">]; <br />
HtmlElement&nbsp;tbUserid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;webBrowser.Document.All[</span><span style="color: #000000">&quot;</span><span style="color: #000000">username</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">]; <br />
HtmlElement&nbsp;tbPasswd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;webBrowser.Document.All[</span><span style="color: #000000">&quot;</span><span style="color: #000000">password</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">]; <br />
<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tbUserid&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;tbPasswd&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;btnSubmit&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></font><font size="2"><span style="color: #000000">; <br />
<br />
tbUserid.SetAttribute(</span><span style="color: #000000">&quot;</span><span style="color: #000000">value</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">smalldust</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">); <br />
tbPasswd.SetAttribute(</span><span style="color: #000000">&quot;</span><span style="color: #000000">value</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">12345678</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">); <br />
<br />
btnSubmit.InvokeMember(</span><span style="color: #000000">&quot;</span><span style="color: #000000">click</span><span style="color: #000000">&quot;</span><span style="color: #000000">);</span></font></div>
<p>这里我们用SetAttribute来设置文本框的&ldquo;value&rdquo;属性，用InvokeMember来调用了按钮的&ldquo;click&rdquo;方法。因为不同的Html元素，其拥有的属性和方法也不尽相同，所以.Net 2.0提供了统一的HtmlElement来概括各种Html元素的同时，提供了这两个方法以调用元素特有的功能。关于各种Html元素的属性和方法一览，可以查阅MSDN的<a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp"><font color="#1d58d1">DHTML Reference</font></a>。</p>
<p>※关于表单的提交，的确还有另一种方法就是获取form元素而不是button，并用form元素的submit方法：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">HtmlElement&nbsp;formLogin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;webBrowser.Document.Forms[</span><span style="color: #000000">&quot;</span><span style="color: #000000">loginForm</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">];&nbsp; <br />
</span><span style="color: #008000">//</span><span style="color: #008000">&hellip;&hellip;&nbsp;</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">formLogin.InvokeMember(</span><span style="color: #000000">&quot;</span><span style="color: #000000">submit</span><span style="color: #000000">&quot;</span><span style="color: #000000">);&nbsp;</span></font></div>
<p>本文之所以没有推荐这种方法，是因为现在的网页，很多都在submit按钮上添加onclick事件，以对提交的内容做最基本的验证。如果直接使用form的submit方法，这些验证代码就得不到执行，有可能会引起错误。 <br />
<br />
<br />
<strong style="color: #0000ff">Study Case 3：查找并选择文本</strong> <br />
<br />
这次我们希望实现一个和IE一模一样的查找功能，以对Web页面内的文字进行查找。</p>
<p>文本查找要借助于TextRange对象的findText方法。但是，.Net里并没有这个对象。这是因为，.Net 2.0提供的HtmlDocument，HtmlWindow，HtmlElement等类，只不过是对原有mshtml这个COM组件的不完整封装，只提供了mshtml的部分功能。所以许多时候，我们仍旧要借助mshtml来实现我们需要的功能。好在这些.Net类都提供了DomDocument这个属性，使得我们很容易把.Net对象转换为COM对象使用。下面的代码演示了如何查找Web页面的文本。 <br />
（需要添加mshtml的引用，并加上using mshtml;）</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;partial&nbsp;</span><span style="color: #0000ff">class</span></font><font size="2"><span style="color: #000000">&nbsp;SearchDemo&nbsp;:&nbsp;Form<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立一个查找用的TextRange（IHTMLTxtRange接口）&nbsp;</span></font><span style="color: #008000"><br />
</span><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IHTMLTxtRange&nbsp;searchRange&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span></font><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span></font><font size="2"><span style="color: #000000">&nbsp;SearchDemo()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;btnSearch_Click(</span><span style="color: #0000ff">object</span></font><font size="2"><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Document的DomDocument属性，就是该对象内部的COM对象。&nbsp;</span></font><span style="color: #008000"><br />
</span><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDocument2&nbsp;document&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(IHTMLDocument2)webBrowser.Document.DomDocument;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;keyword&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;txtKeyword.Text.Trim();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(keyword&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;&quot;</span></font><font size="2"><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></font><font size="2"><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font size="2"><span style="color: #008000">&nbsp;IE的查找逻辑就是，如果有选区，就从当前选区开头+1字符处开始查找；没有的话就从页面最初开始查找。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;这个逻辑其实是有点不大恰当的，我们这里不用管，和IE一致即可。&nbsp;</span></font><span style="color: #008000"><br />
</span><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(document.selection.type.ToLower()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">none</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchRange&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(IHTMLTxtRange)document.selection.createRange();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchRange.collapse(</span><span style="color: #0000ff">true</span></font><font size="2"><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchRange.moveStart(</span><span style="color: #000000">&quot;</span><span style="color: #000000">character</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span></font><font size="2"><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span></font><span style="color: #000000"><br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLBodyElement&nbsp;body&nbsp;</font></span><span style="color: #000000"><font size="2">=</font></span><font size="2"><span style="color: #000000">&nbsp;(IHTMLBodyElement)document.body;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchRange&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(IHTMLTxtRange)body.createTextRange();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果找到了，就选取（高亮显示）该关键字；否则弹出消息。&nbsp;</span></font><span style="color: #008000"><br />
</span><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(searchRange.findText(keyword,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span></font><font size="2"><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchRange.select();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span></font><span style="color: #000000"><br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</font></span><font size="2"><span style="color: #000000">&quot;</span><span style="color: #000000">已搜索到文档结尾。</span><span style="color: #000000">&quot;</span></font><span style="color: #000000"><font size="2">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</font></span></div>
<p>到此为止，简单的查找就搞定了。至于替换功能，看了下一个例子，我相信你就可以触类旁通轻松搞定了。 <br />
<br />
<strong style="color: #0000ff">Study Case 4：高亮显示</strong> <br />
<br />
上一个例子中我们学会了查找文本&mdash;&mdash;究跟到底，对Web页面还是只读不写。那么，如果说要把所有的搜索结果高亮显示呢？我们很快会想到把所有匹配的文字颜色、背景改一下就可以了。</p>
<p>首先想到的可能是直接修改HTML文本吧&hellip;&hellip;但是，与SourceCode的高亮显示不同，我们需要并且只需要高亮页面中的文本部分。HTML标签、脚本代码等等是绝对不应该去改动的。因此我们不能把整个页面的Source Code读进来然后replace，那样有破坏HTML文件结构的可能；我们只能在能够分离出文本与其他内容（标签，脚本&hellip;&hellip;）的前提下进行。 <br />
<br />
具体方法有很多，下面提供两个比较简单的方法。 <br />
&nbsp;</p>
<p><strong>方法一：使用TextRange（IHTMLTxtRange）</strong> <br />
有了上一个Case的基础，相信大家立刻会想到使用TextRange。没错，TextRange除了提供查找方法之外，还提供了一个pasteHTML方法，以指定的HTML文本替换当前TextRange中的内容。代码片断如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;partial&nbsp;</span><span style="color: #0000ff">class</span></font><font size="2"><span style="color: #000000">&nbsp;HilightDemo&nbsp;:&nbsp;Form <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;定义高亮显示效果的标签。</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;tagBefore&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">&lt;span&nbsp;style='background-color:yellow;color:black'&gt;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;tagAfter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">&lt;/span&gt;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&hellip;&hellip;</span></font><span style="color: #008000"><font size="2"> <br />
</font></span><span style="color: #000000"><br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;btnHilight_Click(</span><span style="color: #0000ff">object</span></font><font size="2"><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HtmlDocument&nbsp;htmlDoc&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;webBrowser.Document; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;keyword&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;txtKeyword.Text.Trim(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">if</span> (keyword == &quot;&quot;) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;oTextRange&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;htmlDoc.Body.InvokeMember(</span><span style="color: #000000">&quot;</span><span style="color: #000000">createTextRange</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mshtml.IHTMLTxtRange&nbsp;txtrange&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;oTextRange&nbsp;</span><span style="color: #0000ff">as</span></font><font size="2"><span style="color: #000000">&nbsp;mshtml.IHTMLTxtRange; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(txtrange.findText(keyword,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span></font><font size="2"><span style="color: #000000">)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span></font><font size="2"><span style="color: #000000"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtrange.pasteHTML(tagBefore&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;keyword&nbsp;</span><span style="color: #000000">+</span></font><font size="2"><span style="color: #000000">&nbsp;tagAfter); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span></font><font size="2"><span style="color: #000000">&nbsp;{&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtrange.collapse(</span><span style="color: #0000ff">false</span></font><span style="color: #000000"><font size="2">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></div>
<p><br />
※这段代码里获取IHTMLTxtRange的方式和上面的例子稍稍不同，其实所谓条条大路通罗马，本质是一样的。 <br />
<br />
<strong>方法二：使用DOM（文档对象模型） <br />
</strong>将HTML文档解析为DOM，然后遍历每个节点，在其中搜索关键字并进行相应替换处理即可。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;partial&nbsp;</span><span style="color: #0000ff">class</span></font><font size="2"><span style="color: #000000">&nbsp;HilightDemo&nbsp;:&nbsp;Form <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&hellip;&hellip;</span></font><span style="color: #008000"><font size="2"> <br />
</font></span><span style="color: #000000"><br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;btnHilight_Click(</span><span style="color: #0000ff">object</span></font><font size="2"><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLDocument&nbsp;document&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(HTMLDocument)webBrowser.Document.DomDocument; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;bodyNode&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(IHTMLDOMNode)webBrowser.Document.Body.DomElement; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;keyword&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;txtKeyword.Text.Trim(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(keyword&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;&quot;</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></font><font size="2"><span style="color: #000000">; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HilightText(document,&nbsp;bodyNode,&nbsp;keyword); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;HilightText(HTMLDocument&nbsp;document,&nbsp;IHTMLDOMNode&nbsp;node,&nbsp;</span><span style="color: #0000ff">string</span></font><font size="2"><span style="color: #000000">&nbsp;keyword) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;nodeType&nbsp;=&nbsp;3：text节点</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(node.nodeType&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;nodeText&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;node.nodeValue.ToString(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果找到了关键字</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span></font><font size="2"><span style="color: #000000">&nbsp;(nodeText.Contains(keyword)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;parentNode&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;node.parentNode; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;将关键字作为分隔符，将文本分离，并逐个添加到原text节点的父节点</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodeText.Split(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span></font><font size="2"><span style="color: #000000">[]&nbsp;{&nbsp;keyword&nbsp;},&nbsp;StringSplitOptions.None); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;result.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(result[i]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;&quot;</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;txtNode&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;document.createTextNode(result[i]); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentNode.insertBefore(txtNode,&nbsp;node); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;orgNode&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;document.createTextNode(keyword); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;hilightedNode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IHTMLDOMNode)document.createElement(</span><span style="color: #000000">&quot;</span><span style="color: #000000">SPAN</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLStyle&nbsp;style&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;((IHTMLElement)hilightedNode).style; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">black</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.backgroundColor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">yellow</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hilightedNode.appendChild(orgNode); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentNode.insertBefore(hilightedNode,&nbsp;node); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(result[result.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;&quot;</span></font><font size="2"><span style="color: #000000">) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMNode&nbsp;postNode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;document.createTextNode(result[result.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span></font><font size="2"><span style="color: #000000">]); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentNode.insertBefore(postNode,&nbsp;node); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentNode.removeChild(node); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;End&nbsp;of&nbsp;nodeText.Contains(keyword)</span></font><span style="color: #008000"><font size="2"> <br />
</font></span><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span></font><font size="2"><span style="color: #000000"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果不是text节点，则递归搜索其子节点</span></font><font size="2"><span style="color: #008000"> <br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHTMLDOMChildrenCollection&nbsp;childNodes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;node.childNodes&nbsp;</span><span style="color: #0000ff">as</span></font><font size="2"><span style="color: #000000">&nbsp;IHTMLDOMChildrenCollection; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(IHTMLDOMNode&nbsp;n&nbsp;</span><span style="color: #0000ff">in</span></font><span style="color: #000000"><font size="2">&nbsp;childNodes) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HilightText(document,&nbsp;n,&nbsp;keyword); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
</font></span></div>
<p>上面的两段代码都是为了清晰易懂而精简得不能再简的，有很多地方很不完善。比如，没考虑到如何从高亮显示状态复原；也没有大小写匹配等等。当然，掌握了原理之后相信这些都不会太难。 <br />
<br />
这两种方法各有优缺点： <br />
使用TextRange较轻量迅速，而且有一个特长，就是可以把跨标签（Tag）的关键字挑出来。例如，有这么一段HTML：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #0000ff">&lt;</span><span style="color: #800000">b</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hel</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">b</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">lo&nbsp;World!</span></font></div>
<p>先不管作者出于什么目的让Hel三个字母成为粗体，总之显示在页面上的是一句&ldquo;Hello World!&rdquo;。在我们希望高亮页面中的&ldquo;Hello&rdquo;这个关键字时，如果用DOM分析的话，会得出含有&ldquo;Hel&rdquo;的&lt;b&gt;节点和文本节点&ldquo;lo World!&rdquo;两个节点，因此无法将其挑出来。而TextRange则能正确识别，将其设置为高亮。因此也可以说TextRange是只和文本有关，和HTML语法结构无关的对象。 <br />
<br />
但是，TextRange也有其致命缺点，加亮容易，反向的话就很难。换句话说，去除高亮显示的时候不能再用TextRange，而需要采用其他方法。 <br />
<br />
而DOM方法则正好相反， 由于DOM的树状结构特性，虽然不能（或者很难）跨越Tag搜索关键字，但是去除高亮显示并不繁琐。<br />
<br />
<strong><font color="#0000ff">Study Case 5：与脚本的互操作</font></strong> <br />
<br />
在Case 1当中，我们已经看到，Web页面的HTML元素的事件，可以由Windows Form端来响应，可以在某种程度上看作是Web页面调用WinForm；那么反过来，WinForm除了可以直接访问Web页面的HTML元素之外，能否调用Web页面里的各种Script呢？<br />
<br />
首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff"><font size="2">function</font></span><font size="2"><span style="color: #000000">&nbsp;DoAdd(a,&nbsp;b)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">+</span></font><span style="color: #000000"><font size="2">&nbsp;b;<br />
}</font></span></div>
<p>那么，我们要在WinForm调用它，只需如下代码即可：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;oSum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;webBrowser.Document.InvokeScript(</span><span style="color: #000000">&quot;</span><span style="color: #000000">DoAdd</span><span style="color: #000000">&quot;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">[]&nbsp;{&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span></font><font size="2"><span style="color: #000000">&nbsp;});<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Convert.ToInt32(oSum);</span></font></div>
<p>其次，如果我们想执行一段Web页面中原本没有的脚本，该怎么做呢？这次.Net的类没有提供，看来还要依靠COM了。IHTMLWindow2可以将任意的字符串作为脚本代码来执行。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline01&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">function&nbsp;ShowPageInfo()&nbsp;{</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline02&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;numLinks&nbsp;=&nbsp;document.links.length;&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline03&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;numForms&nbsp;=&nbsp;document.forms.length;&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline04&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;numImages&nbsp;=&nbsp;document.images.length;&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline05&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;numScripts&nbsp;=&nbsp;document.scripts.length;&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline06&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('网页的统计结果：\r\n链接数：'&nbsp;+&nbsp;numLinks&nbsp;+&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline07&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'\r\n表单数：'&nbsp;+&nbsp;numForms&nbsp;+&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline08&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'\r\n图像数：'&nbsp;+&nbsp;numImages&nbsp;+&nbsp;</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline09&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'\r\n脚本数：'&nbsp;+&nbsp;numScripts);}</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;scriptline10&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">@&quot;</span><span style="color: #000000">ShowPageInfo();</span><span style="color: #000000">&quot;</span></font><font size="2"><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;strScript&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;scriptline01&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline02&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline03&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline04&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline05&nbsp;</span><span style="color: #000000">+</span></font><span style="color: #000000"><br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scriptline06&nbsp;</font></span><font size="2"><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline07&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline08&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;scriptline09&nbsp;</span><span style="color: #000000">+</span></font><font size="2"><span style="color: #000000">&nbsp;scriptline10;<br />
<br />
IHTMLWindow2&nbsp;win&nbsp;</span><span style="color: #000000">=</span></font><font size="2"><span style="color: #000000">&nbsp;(IHTMLWindow2)webBrowser.Document.Window.DomWindow;<br />
win.execScript(strScript,&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">Javascript</span><span style="color: #000000">&quot;</span><span style="color: #000000">);</span></font></div>
<p>OK，今天就写到这里吧，再想起什么来再补充吧。欢迎大家多多指正，欢迎讨论。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=868" /> 
	  <id>http://www.kiyeer.net/default.asp?id=868</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互) ]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=2" label="Asp.Net/Vb/C#" /> 
	  <updated>2010-05-13T10:50:58+08:00</updated>
	  <published>2010-05-13T10:50:58+08:00</published>
		  <summary type="html"><![CDATA[<p>这是我一个朋友写的日志，觉得有些用途，就发表在这里，以便以后查阅，也希望对各位有所帮助。</p>
<p>　　刚到公司混的时候，老板要求实现一个从C#的windows应用程序传参数到一个网页，然后这个网页不显示出来，但能把数据返回给应用程序的功能，问了好多人，找了好多资料，都搞不定，后来还是在老板的帮助下搞定的......，现在把方法写出来供大家参考。 &shy;</p>
<p>　　其原理是，利用winfrom模拟表单提交数据，将要提交的参数提交给网页，网页执行代码，得到数据，然后Winform程序将网页的所有源代码读取下来，这样就达到windows应用程序和web应用程序之间传参和现实数据的效果了。 &shy;</p>
<p>&nbsp;&nbsp;&nbsp; 首先创建一个windows应用程序和web应用程序。 &shy;</p>
<p>&nbsp;&nbsp;&nbsp; 在web应用程序中，将网页切换到源代码并把源代码中一些没用的代码删掉，只保留头部，在windows应用程序读取网页源码时，这些都会被一起读下来，但这些都是没用的数据，而且删掉没什么影响。需要保留的代码如下： &shy;</p>
<p>　　&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot;&nbsp; CodeFile=&quot;Default.aspx.cs&quot; Inherits=&quot;_Default&quot; %&gt; &shy;</p>
<p>　　然后在Page_Load中实现功能，以下为一个将两个数相加并将和返回给winform的网页例子。 &shy;</p>
<p>　　string A = Request.Form[&quot;a&quot;].ToString();//由winform中传给网页的参数用a标识 &shy;</p>
<p>　　string B = Request.Form[&quot;b&quot;].ToString(); &shy;</p>
<p>　　int C = Convert.ToInt32(A) + Convert.ToInt32(B); &shy;</p>
<p>　　Response.Write(C.ToString());//将数据写到网页中 &shy;</p>
<p>　　在winform中实现传参的例子代码如下： &shy;</p>
<p>　　private void button1_Click(object sender, EventArgs e) &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebClient w = new WebClient(); &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Collections.Specialized.NameValueCollection VarPost = new System.Collections.Specialized.NameValueCollection(); &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VarPost.Add(&quot;a&quot;, textBox1.Text.Trim());//将textBox1中的数据变为用a标识的参数，并用POST传值方式传给网页 &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VarPost.Add(&quot;b&quot;, textBox2.Text.Trim()); &shy;</p>
<p>　　　　//将参数列表VarPost中的所有数据用POST传值的方式传给http://申请好的域名或用IIs配置好的地址/Default.aspx，</p>
<p>　　　　//并将从网页上返回的数据以字节流存放到byRemoteInfo中)(注：IIS配置的时候经常没配置好会提示错误，嘿) &shy;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>　　　　byte[] byRemoteInfo = w.UploadValues(&quot;http://申请好的域名或用IIs配置好的地址/Default.aspx&quot;, &quot;POST&quot;, VarPost);<br />
　　　　string sRemoteInfo = System.Text.Encoding.UTF8.GetString(byRemoteInfo); &shy;</p>
<p>　　　　label1.Text = sRemoteInfo; &shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &shy;</p>
<p>　　这样就实现了C# Winform利用POST传值方式模拟表单提交数据，在这仅供大家参考。 &shy;</p>
<p>　　PS：原本心情挺好的，后来变得有点郁闷，所以写得有点乱，看完请不要扔鸡蛋啊！！呵呵....&shy; <br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=867" /> 
	  <id>http://www.kiyeer.net/default.asp?id=867</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[纯数字不重复排列的另类方法]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=3" label="Web设计/Jquery" /> 
	  <updated>2009-12-31T15:33:07+08:00</updated>
	  <published>2009-12-31T15:33:07+08:00</published>
		  <summary type="html"><![CDATA[有一组数据，大概10万个左右，每一单位的值不会大于30000，要求按照由大到小的顺序不重复输出。<br/><br/>参考无忧cosin的方法后（多谢），整理的方法如下<br/><br/>//一段随机数，模拟用<br/>var baseNum=[];<br/>for(var i= 0;i&lt; 100000 ;i++){<br/>random = Math.floor(Math.random()*i);<br/>baseNum.push(random);<br/>}<br/>var baseNumLen = baseNum.length;<br/>var numSubscript = [];<br/>//将数字作为下标和值放到另一数组内，实现排序和不重复<br/>for (var i =0;i&lt;basenumlen ;i++){<br/>if(numSubscript[baseNum[i]] == undefined)numSubscript[baseNum[i]]=baseNum[i];<br/>}<br/>//去除空的值并颠倒一下<br/>baseNum = numSubscript.join(&#39;,&#39;).replace(/([,]+)/ig, &#39;,&#39;).split(&#39;,&#39;).reverse();<br/>document.write(baseNum);<br/><br/><br/>题外：<br/>假如数组是自己生成，客服果果写的这段代码就很好了。（牛逼）<br/>var baseNum=[],tmp={},v;<br/>for(var i= 0;i&lt; 100000 ;i++){<br/>tmp[Math.floor(Math.random()*i)]=true;<br/>};<br/>i=0;<br/>for (var k in tmp){<br/>baseNum[i++]=k;<br/>};<br/>baseNum.sort(fn);<br/>function fn(x,y) {<br/>return x-y&amp;gt;0?1:-1<br/>}<br/>document.write(baseNum.join(&#39;&#39;));<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=866" /> 
	  <id>http://www.kiyeer.net/default.asp?id=866</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[windows 7资源管理器的启动位置]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=8" label="乱七八糟" /> 
	  <updated>2009-12-15T15:01:36+08:00</updated>
	  <published>2009-12-15T15:01:36+08:00</published>
		  <summary type="html"><![CDATA[可以通过下面的步骤来修改它指向我的电脑：<br/>1. 右键点击Windows资源管理器的图标，菜单将展开<br/>2. 再次右键点击菜单中的Windows资源管理器，点击属性。<br/>3. 在目标一栏中替换成下面的字符串<br/>&nbsp;&nbsp;%SystemRoot%\explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}<br/>4. 点击确定<br/>下次按这个按钮时就会打开我的电脑了。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=865" /> 
	  <id>http://www.kiyeer.net/default.asp?id=865</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[C# 获取机器的硬件信息（CPU ID序列号, 主板信息，硬盘序列号，系统信息）]]></title>
	  <author>
		 <name>kiyeer</name>
		 <uri>http://www.kiyeer.net/</uri>
		 <email>kiyeer@163.com</email>
	  </author>
	  <category term="" scheme="http://www.kiyeer.net/default.asp?cateID=2" label="Asp.Net/Vb/C#" /> 
	  <updated>2009-12-10T11:01:58+08:00</updated>
	  <published>2009-12-10T11:01:58+08:00</published>
		  <summary type="html"><![CDATA[在很多情况下，你可能都需要得到微机的硬件信息。比如：你想给你的软件加锁，不让别人随便访问。<br/><br/>最有效的办法是获取CPU的序列号，然后让你的软件只能运行在有这样的CPU序列号的机器上。众所周知，CPU序列号是唯一的！因此，这样就可以为你的软件加锁了。<br/><br/>另外一个需要硬盘信息的例子是：硬盘有几个分区，每个分区各有多少剩余空间。当你正在做一个多媒体应用程序的时候，你可能也需要获得有关声卡、显卡的硬件信息。<br/><br/>上面代码的Key是一个将被对应正确的数据填入的值。例如，获取CPU的信息，就需要把Key值设成Win32_Processor。所有Key可能的值，列举如下：<br/><br/><br/><br/>Win32_1394Controller<br/>Win32_1394ControllerDevice<br/>Win32_Account<br/>Win32_AccountSID<br/>Win32_ACE<br/>Win32_ActionCheck<br/>Win32_AllocatedResource<br/>Win32_ApplicationCommandLine<br/>Win32_ApplicationService<br/>Win32_AssociatedBattery<br/>Win32_AssociatedProcessorMemory<br/>Win32_BaseBoard<br/>Win32_BaseService<br/>Win32_Battery<br/>Win32_Binary<br/>Win32_BindImageAction<br/>Win32_BIOS<br/>Win32_BootConfiguration<br/>Win32_Bus<br/>Win32_CacheMemory<br/>Win32_CDROMDrive<br/>Win32_CheckCheck<br/>Win32_CIMLogicalDeviceCIMDataFile<br/>Win32_ClassicCOMApplicationClasses<br/>Win32_ClassicCOMClass<br/>Win32_ClassicCOMClassSetting<br/>Win32_ClassicCOMClassSettings<br/>Win32_ClassInfoAction<br/>Win32_ClientApplicationSetting<br/>Win32_CodecFile<br/>Win32_COMApplication<br/>Win32_COMApplicationClasses<br/>Win32_COMApplicationSettings<br/>Win32_COMClass<br/>Win32_ComClassAutoEmulator<br/>Win32_ComClassEmulator<br/>Win32_CommandLineAccess<br/>Win32_ComponentCategory<br/>Win32_ComputerSystem<br/>Win32_ComputerSystemProcessor<br/>Win32_ComputerSystemProduct<br/>Win32_COMSetting<br/>Win32_Condition<br/>Win32_Cr&#101;ateFolderAction<br/>Win32_CurrentProbe<br/>Win32_DCOMApplication<br/>Win32_DCOMApplicationAccessAllowedSetting<br/>Win32_DCOMApplicationLaunchAllowedSetting<br/>Win32_DCOMApplicationSetting<br/>Win32_DependentService<br/>Win32_Desktop<br/>Win32_DesktopMonitor<br/>Win32_DeviceBus<br/>Win32_DeviceMemoryAddress<br/>Win32_DeviceSettings<br/>Win32_Directory<br/>Win32_DirectorySpecification<br/>Win32_DiskDrive<br/>Win32_DiskDriveToDiskPartition<br/>Win32_DiskPartition<br/>Win32_DisplayConfiguration<br/>Win32_DisplayControllerConfiguration<br/>Win32_DMAChannel<br/>Win32_DriverVXD<br/>Win32_DuplicateFileAction<br/>Win32_Environment<br/>Win32_EnvironmentSpecification<br/>Win32_ExtensionInfoAction<br/>Win32_Fan<br/>Win32_FileSpecification<br/>Win32_FloppyController<br/>Win32_FloppyDrive<br/>Win32_FontInfoAction<br/>Win32_Group<br/>Win32_GroupUser<br/>Win32_HeatPipe<br/>Win32_IDEController<br/>Win32_IDEControllerDevice<br/>Win32_ImplementedCategory<br/>Win32_InfraredDevice<br/>Win32_IniFileSpecification<br/>Win32_InstalledSoftwareElement<br/>Win32_IRQResource<br/>Win32_Keyboard<br/>Win32_LaunchCondition<br/>Win32_LoadOrderGroup<br/>Win32_LoadOrderGroupServiceDependencies<br/>Win32_LoadOrderGroupServiceMembers<br/>Win32_LogicalDisk<br/>Win32_LogicalDiskRootDirectory<br/>Win32_LogicalDiskToPartition<br/>Win32_LogicalFileAccess<br/>Win32_LogicalFileAuditing<br/>Win32_LogicalFileGroup<br/>Win32_LogicalFileOwner<br/>Win32_LogicalFileSecuritySetting<br/>Win32_LogicalMemoryConfiguration<br/>Win32_LogicalProgramGroup<br/>Win32_LogicalProgramGroupDirectory<br/>Win32_LogicalProgramGroupItem<br/>Win32_LogicalProgramGroupItemDataFile<br/>Win32_LogicalShareAccess<br/>Win32_LogicalShareAuditing<br/>Win32_LogicalShareSecuritySetting<br/>Win32_ManagedSystemElementResource<br/>Win32_MemoryArray<br/>Win32_MemoryArrayLocation<br/>Win32_MemoryDevice<br/>Win32_MemoryDeviceArray<br/>Win32_MemoryDeviceLocation<br/>Win32_MethodParameterClass<br/>Win32_MIMEInfoAction<br/>Win32_MotherboardDevice<br/>Win32_MoveFileAction<br/>Win32_MSIResource<br/>Win32_NetworkAdapter<br/>Win32_NetworkAdapterConfiguration<br/>Win32_NetworkAdapterSetting<br/>Win32_NetworkClient<br/>Win32_NetworkConnection<br/>Win32_NetworkLoginProfile<br/>Win32_NetworkProtocol<br/>Win32_NTEventlogFile<br/>Win32_NTLogEvent<br/>Win32_NTLogEventComputer<br/>Win32_NTLogEventLog<br/>Win32_NTLogEventUser<br/>Win32_ODBCAttribute<br/>Win32_ODBCDataSourceAttribute<br/>Win32_ODBCDataSourceSpecification<br/>Win32_ODBCDriverAttribute<br/>Win32_ODBCDriverSoftwareElement<br/>Win32_ODBCDriverSpecification<br/>Win32_ODBCSourceAttribute<br/>Win32_ODBCTranslatorSpecification<br/>Win32_OnBoardDevice<br/>Win32_OperatingSystem<br/>Win32_OperatingSystemQFE<br/>Win32_OSRecoveryConfiguration<br/>Win32_PageFile<br/>Win32_PageFileElementSetting<br/>Win32_PageFileSetting<br/>Win32_PageFileUsage<br/>Win32_ParallelPort<br/>Win32_Patch<br/>Win32_PatchFile<br/>Win32_PatchPackage<br/>Win32_PCMCIAController<br/>Win32_Perf<br/>Win32_PerfRawData<br/>Win32_PerfRawData_ASP_ActiveServerPages<br/>Win32_PerfRawData_ASPNET_114322_ASPNETAppsv114322<br/>Win32_PerfRawData_ASPNET_114322_ASPNETv114322<br/>Win32_PerfRawData_ASPNET_ASPNET<br/>Win32_PerfRawData_ASPNET_ASPNETApplications<br/>Win32_PerfRawData_IAS_IASAccountingClients<br/>Win32_PerfRawData_IAS_IASAccountingServer<br/>Win32_PerfRawData_IAS_IASAuthenticationClients<br/>Win32_PerfRawData_IAS_IASAuthenticationServer<br/>Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal<br/>Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator<br/>Win32_PerfRawData_MSFTPSVC_FTPService<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBackupDevice<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBufferPartition<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerCacheManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerLatches<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerLocks<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationAgents<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationDist<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationLogreader<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationMerge<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationSnapshot<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerUserSettable<br/>Win32_PerfRawData_NETFramework_NETCLRExceptions<br/>Win32_PerfRawData_NETFramework_NETCLRInterop<br/>Win32_PerfRawData_NETFramework_NETCLRJit<br/>Win32_PerfRawData_NETFramework_NETCLRLoading<br/>Win32_PerfRawData_NETFramework_NETCLRLocksAndThreads<br/>Win32_PerfRawData_NETFramework_NETCLRMemory<br/>Win32_PerfRawData_NETFramework_NETCLRRemoting<br/>Win32_PerfRawData_NETFramework_NETCLRSecurity<br/>Win32_PerfRawData_Outlook_Outlook<br/>Win32_PerfRawData_PerfDisk_PhysicalDisk<br/>Win32_PerfRawData_PerfNet_Browser<br/>Win32_PerfRawData_PerfNet_Redirector<br/>Win32_PerfRawData_PerfNet_Server<br/>Win32_PerfRawData_PerfNet_ServerWorkQueues<br/>Win32_PerfRawData_PerfOS_Cache<br/>Win32_PerfRawData_PerfOS_Memory<br/>Win32_PerfRawData_PerfOS_Objects<br/>Win32_PerfRawData_PerfOS_PagingFile<br/>Win32_PerfRawData_PerfOS_Processor<br/>Win32_PerfRawData_PerfOS_System<br/>Win32_PerfRawData_PerfProc_FullImage_Costly<br/>Win32_PerfRawData_PerfProc_Image_Costly<br/>Win32_PerfRawData_PerfProc_JobObject<br/>Win32_PerfRawData_PerfProc_JobObjectDetails<br/>Win32_PerfRawData_PerfProc_Process<br/>Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly<br/>Win32_PerfRawData_PerfProc_Thread<br/>Win32_PerfRawData_PerfProc_ThreadDetails_Costly<br/>Win32_PerfRawData_RemoteAccess_RASPort<br/>Win32_PerfRawData_RemoteAccess_RASTotal<br/>Win32_PerfRawData_RSVP_ACSPerRSVPService<br/>Win32_PerfRawData_Spooler_PrintQueue<br/>Win32_PerfRawData_TapiSrv_Telephony<br/>Win32_PerfRawData_Tcpip_ICMP<br/>Win32_PerfRawData_Tcpip_IP<br/>Win32_PerfRawData_Tcpip_NBTConnection<br/>Win32_PerfRawData_Tcpip_NetworkInterface<br/>Win32_PerfRawData_Tcpip_TCP<br/>Win32_PerfRawData_Tcpip_UDP<br/>Win32_PerfRawData_W3SVC_WebService<br/>Win32_PhysicalMemory<br/>Win32_PhysicalMemoryArray<br/>Win32_PhysicalMemoryLocation<br/>Win32_PNPAllocatedResource<br/>Win32_PnPDevice<br/>Win32_PnPEntity<br/>Win32_PointingDevice<br/>Win32_PortableBattery<br/>Win32_PortConnector<br/>Win32_PortResource<br/>Win32_POTSModem<br/>Win32_POTSModemToSerialPort<br/>Win32_PowerManagementEvent<br/>Win32_Printer<br/>Win32_PrinterConfiguration<br/>Win32_PrinterController<br/>Win32_PrinterDriverDll<br/>Win32_PrinterSetting<br/>Win32_PrinterShare<br/>Win32_PrintJob<br/>Win32_PrivilegesStatus<br/>Win32_Process<br/>Win32_Processor<br/>Win32_ProcessStartup<br/>Win32_Product<br/>Win32_ProductCheck<br/>Win32_ProductResource<br/>Win32_ProductSoftwareFeatures<br/>Win32_ProgIDSpecification<br/>Win32_ProgramGroup<br/>Win32_ProgramGroupContents<br/>Win32_ProgramGroupOrItem<br/>Win32_Property<br/>Win32_ProtocolBinding<br/>Win32_PublishComponentAction<br/>Win32_QuickFixEngineering<br/>Win32_Refrigeration<br/>Win32_Registry<br/>Win32_RegistryAction<br/>Win32_RemoveFileAction<br/>Win32_RemoveIniAction<br/>Win32_ReserveCost<br/>Win32_ScheduledJob<br/>Win32_SCSIController<br/>Win32_SCSIControllerDevice<br/>Win32_SecurityDescriptor<br/>Win32_SecuritySetting<br/>Win32_SecuritySettingAccess<br/>Win32_SecuritySettingAuditing<br/>Win32_SecuritySettingGroup<br/>Win32_SecuritySettingOfLogicalFile<br/>Win32_SecuritySettingOfLogicalShare<br/>Win32_SecuritySettingOfObject<br/>Win32_SecuritySettingOwner<br/>Win32_SelfRegModuleAction<br/>Win32_SerialPort<br/>Win32_SerialPortConfiguration<br/>Win32_SerialPortSetting<br/>Win32_Service<br/>Win32_ServiceControl<br/>Win32_ServiceSpecification<br/>Win32_ServiceSpecificationService<br/>Win32_SettingCheck<br/>Win32_Share<br/>Win32_ShareToDirectory<br/>Win32_ShortcutAction<br/>Win32_ShortcutFile<br/>Win32_ShortcutSAP<br/>Win32_SID<br/>Win32_SMBIOSMemory<br/>Win32_SoftwareElement<br/>Win32_SoftwareElementAction<br/>Win32_SoftwareElementCheck<br/>Win32_SoftwareElementCondition<br/>Win32_SoftwareElementResource<br/>Win32_SoftwareFeature<br/>Win32_SoftwareFeatureAction<br/>Win32_SoftwareFeatureCheck<br/>Win32_SoftwareFeatureParent<br/>Win32_SoftwareFeatureSoftwareElements<br/>Win32_SoundDevice<br/>Win32_StartupCommand<br/>Win32_SubDirectory<br/>Win32_SystemAccount<br/>Win32_SystemBIOS<br/>Win32_SystemBootConfiguration<br/>Win32_SystemDesktop<br/>Win32_SystemDevices<br/>Win32_SystemDriver<br/>Win32_SystemDriverPNPEntity<br/>Win32_SystemEnclosure<br/>Win32_SystemLoadOrderGroups<br/>Win32_SystemLogicalMemoryConfiguration<br/>Win32_SystemMemoryResource<br/>Win32_SystemNetworkConnections<br/>Win32_SystemOperatingSystem<br/>Win32_SystemPartitions<br/>Win32_SystemProcesses<br/>Win32_SystemProgramGroups<br/>Win32_SystemResources<br/>Win32_SystemServices<br/>Win32_SystemSetting<br/>Win32_SystemSlot<br/>Win32_SystemSystemDriver<br/>Win32_SystemTimeZone<br/>Win32_SystemUsers<br/>Win32_TapeDrive<br/>Win32_TemperatureProbe<br/>Win32_Thread<br/>Win32_TimeZone<br/>Win32_Trustee<br/>Win32_TypeLibraryAction<br/>Win32_UninterruptiblePowerSupply<br/>Win32_USBController<br/>Win32_USBControllerDevice<br/>Win32_UserAccount<br/>Win32_UserDesktop<br/>Win32_VideoConfiguration<br/>Win32_VideoController<br/>Win32_VideoSettings<br/>Win32_VoltageProbe<br/>Win32_WMIElementSetting<br/>Win32_WMISetting <br/><br/><br/>首先，调用ManagementObjectSearcher实例（在本文中的例子里为searcher ）中的Get()方法，该方法将会把返回信息填在这个实例中。然后，你所要做的就是处理这个实例searcher中的数据。<br/><br/>foreach (ManagementObject share in searcher.Get()){// Some Codes ...}<br/>每个ManagementObject的对象中都有一些，我们所需要的数据，当然我们可以接着这么处理这些数据：<br/><br/>foreach (PropertyData PC in share.Properties){//some codes ...}<br/>本文中代码的其它部分只是对于ListView控件的一些操作，很简单，就不再详述了！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.kiyeer.net/article.asp?id=864" /> 
	  <id>http://www.kiyeer.net/default.asp?id=864</id>
  </entry>	
		
</feed>

