Visual Basic中如何处理HTML文档和剪贴板

2016-02-19 19:23 22 1 收藏

下面图老师小编要跟大家分享Visual Basic中如何处理HTML文档和剪贴板,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - Web开发 】

  我的程序需要将HTML文档放进剪贴板中,但我不知道要怎样处理才能使其他程序也能使用它。我查看了一些关于HTML Clipboard Format (CF_HTML)的参考说明,但我还是找不到准确的定义。请问我该如何操作?

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  解答:

  使用带有Windows 剪贴板的CF_HTML Clipboard Format的确容易让人搞胡涂,一部分是因为它不是clipboard format中自带的剪贴板;它是一个注册格式(registered format),所以不是一个常量,因为它的值会因为系统的不同而产生变化。你可以通过一个简单的API调用 -- RegisterClipboardFormat来获得一个注册剪贴板格式的值。这个函数的首次调用会通过一个给定的字符串来执行,它返回一个范围在C000-FFFF之间的唯一值。每一个在系统上处理的后续调用(subsequent call)会返回同样的值。用于这种格式中的关键字符串就是“HTML Format”:

  
Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA"
(ByVal lpString As String) As Long
Dim CF_HTML As Long
Const RegHtml As String = "HTML Format"
CF_HTML = RegisterClipboardFormat(RegHtml)

  你必须首先构建一个描述性的header,并在将HTML数据放入剪贴板之前先把它放到数据中。这个header会给其他程序提供描述版本信息、HTML起始数据的偏移量(offset),以及有关实际选择范围(actual selection)起始地方的信息。用户可能会选择的HTML文档的一部分甚至只是一个元素(比如一个table中的几行)作为一个选择区域。页面的其他部分,比如内联样式定义(inline style definitions)则可能会被要求进行完全渲染(render)。你不仅需要将最初所选择的HTML区域放入剪贴板,而且还需要放入一个header,它看起来就像是这样:

Version:1.0
StartHTML:000000258
EndHTML:000001491
StartFragment:000001172
EndFragment:000001411

  应用程序通过StartFragment和EndFragment属性来决定哪些数据需要粘贴,这些数据或许会(也可能不会)用剩下的HTML对所选择的部分进行格式安排。你必须将HTML注释放入数据中以便将来对所选部分进行识别。很明显,你必须在构建最后的header之前完成它,否则偏移量会有变化。一个用于所选数据的opening/closing注释标签分别是“!--StartFragment--”和“!--EndFragment--”

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  列表1. 在你构建一个用于HTML片断的描述性header时这个程序(routine)会很有用。如果你放入整个HTML文档,则StartFragment标签会紧随body标签放入,而EndFragment标签则会被放在/body之前。如果你只是放入一段HTML而不是整个文档,那么程序则只会放入html和body标签。

Public Function HtmlDescribed(ByVal Fragment As String) As String
 Dim Data As String
 Dim nPos As Long
 Const Description As String = "Version:1.0" & vbCrLf & "StartHTML:aaaaaaaaaa" & vbCrLf & _
"EndHTML:bbbbbbbbbb" & vbCrLf & "StartFragment:cccccccccc" & vbCrLf & _
"EndFragment:dddddddddd" & vbCrLf
 Const FragmentStart As String = "!--StartFragment--"
 Const FragmentEnd As String = "!--EndFragment--"
 Const Fmt As String = "0000000000"
 ' Add the starting and ending tags for the
 ' HTML fragment by looking for body tag.
 nPos = InStr(1, Fragment, "body", vbTextCompare)
 Select Case nPos
  Case 0
   Fragment = "htmlbody" & vbCrLf & FragmentStart & Fragment
  Case Else
   nPos = InStr(nPos, Fragment, "")
   If nPos 0 And nPos Len(Fragment) Then
    Fragment = Left$(Fragment, nPos) & FragmentStart & Mid$(Fragment, nPos + 1)
   End If
 End Select

nPos = InStr(1, Fragment, "/body", vbTextCompare)
 Select Case nPos
  Case 0
   Fragment = Fragment & FragmentEnd & vbCrLf & "/body/html"
  Case Else
   Fragment = Left$(Fragment, nPos - 1) & FragmentEnd & Mid$(Fragment, nPos)
 End Select
 ' Build the HTML given the description, the
 ' fragment, and the context. And, replace the
 ' offset placeholders in the description with
 ' values for the offsets of StartHMTL,
 ' EndHTML, StartFragment, and EndFragment.
 ' Offsets need to be zero-based when placed on
 ' clipboard, so subtract 1
 ' from each before injecting.
 Data = Description & Fragment
 Data = Replace(Data, "aaaaaaaaaa", Format$(Len(Description), Fmt))
 Data = Replace(Data, "bbbbbbbbbb", Format$(Len(Data), Fmt))
 nPos = InStr(Data, FragmentStart) - 1
 Data = Replace(Data, "cccccccccc", Format$(nPos + Len(FragmentStart), Fmt))
 nPos = InStr(Data, FragmentEnd) - 1
 Data = Replace(Data, "dddddddddd", Format$(nPos, Fmt))
 ' Return attributed string.
 HtmlDescribed = Data
End Function
  在这里我无法对这个header的各个方面都进行详细的介绍,所以我只能讲解一些要点,你可以参考范例代码以及进行更深入的了解。你必须记住几个要点。Header中的偏移量是以零为基准的,因此你必须以此来调节你的字符串操作程序(string-manipulation routine )。而且,如果你不仅需要读取而且需要编写header,你则必须了解字符数(number of digits )(比如Internet Explorer [IE] 是9,Word是10)。


  最后,如果你只是将CF_HTML放入剪贴板,那么诸如Word和FrontPage等程序就处理不了了。你必须同时给剪贴板提供一个格式化的HTML的纯文本编译(plain-text rendition)以实现你所希望的结果。许多用来执行HTML-to-text转换的工具或是macho可能都需要执行自带的剖析器。但是Windows程序员是不需要对HTML进行手动解析的。你可以用OS来取代这个日常任务:

  
Public Function Html2Text(ByVal Data As String) As String
 Dim obj As Object
 On Error Resume Next
 Set obj = CreateObject("htmlfile")
 obj.Open
 obj.Write Data
 Html2Text = obj.Body.InnerText
End Function

  升级IE并不是解析HTML最快的方法,但却是相当好用的方法。

来源:http://www.tulaoshi.com/n/20160219/1620890.html

延伸阅读
标签: Delphi
  应用程序间的数据交换是象 Windows 这样的多任务环境的重要特性。作为一种基于 Windows 的开发工具, Delphi支持如下四种数据交换方式:剪贴板、动态数据交换 ( DDE) 、对象联接与嵌入 (OLE) 以及动态联接库 (DLLs) 。这中间前三种方式最为常用, OLE 功能最为强大, DDE次之。而剪贴板使用最为方便。在本章,我们只讨论剪贴板和动...
标签: ASP
  /* 豆腐制作 都是精品 http://www.asp888.net 豆腐技术站 如转载 请保留完整版权信息 */ 在做网络追捕的时候,经常遇到这样的问题,是否需要将IP 地址重新输入一次的问题,所以在这里我考虑如何使用剪贴板的问题 幸好在IE的HTML扩展DOM中有这样的功能,我公享出来,大家一同分享。 <HTML <HEAD <SCRIPT LANGUAGE="JScript...
标签: word
在Word2010文档中使用Office剪贴板 通过Office剪贴板,用户可以有选择地粘贴暂存于Office剪贴板中的内容,使粘贴操作更加灵活。在Word2010文档中使用Office剪贴板的步骤如下所述: 第1步,打开Word2010文档窗口,选中一部分需要复制或剪切的内容,并执行复制或剪切命令。然后在开始功能区单击剪贴板分组右下角的显示‘Officetul...
什么是微云剪贴板?   微云剪贴板是一个便捷工具。通过它,您可以在手机上复制,在电脑上粘贴;您也可以在电脑上复制,在手机上粘贴。 比如: 1、从手机上复制网站地址,用电脑的浏览器打开; 2、从电脑上复制电话号码,在手机上拨打。
标签: word
Word中剪贴板工具的使用教程   大家都会用word的粘贴、剪切、复制功能,无非是鼠标右键或者ctrl+V、ctrl+X、ctrl+C等。其实word中的剪切板工具可以让你的粘贴复制工作变得更加快捷、智能化。 动画教程演示: word中格式刷工具的动画教程   word中的格式刷工具功能很好很强大啊,以前只知道选择源格式对象,然后单击...

经验教程

554

收藏

92
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部