当前位置: 首页 > 编程日记 > 正文

xml操作类(转载)

作者:未知   请与本人联系
<%

Class XMLDOMDocument
  Private fNode,fANode
  Private fErrInfo,fFileName,fOpen
  Dim XmlDom
 
  '返回节点的缩进字串
  Private Property Get TabStr(byVal Node)
    TabStr=""
    If Node Is Nothing Then Exit Property
    If not Node.parentNode Is nothing Then TabStr="  "&TabStr(Node.parentNode)
  End Property
 
  '返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象
  Public Property Get ChildNode(byVal ElementOBJ,byVal ChildNodeObj,byVal IsAttributeNode)
    Dim Element
    Set ChildNode=Nothing
       
    If IsNull(ChildNodeObj) Then
      If IsAttributeNode=false Then
        Set ChildNode=fNode
      Else
        Set ChildNode=fANode
      End If
      Exit Property
    ElseIf IsObject(ChildNodeObj) Then
      Set ChildNode=ChildNodeObj
      Exit Property
    End If
   
    Set Element=Nothing
    If LCase(TypeName(ChildNodeObj))="string" and Trim(ChildNodeObj)<>"" Then
      If IsNull(ElementOBJ) Then
         Set Element=fNode
      ElseIf LCase(TypeName(ElementOBJ))="string" Then
         If Trim(ElementOBJ)<>"" Then
           Set Element=XmlDom.selectSingleNode("//"&Trim(ElementOBJ))
           If Lcase(Element.nodeTypeString)="attribute" Then Set Element=Element.selectSingleNode("..")
         End If
      ElseIf IsObject(ElementOBJ) Then
         Set Element=ElementOBJ
      End If
     
      If Element Is Nothing Then
        Set ChildNode=XmlDom.selectSingleNode("//"&Trim(ChildNodeObj))
      ElseIf IsAttributeNode=true Then
        Set ChildNode=Element.selectSingleNode("./@"&Trim(ChildNodeObj))
      Else
        Set ChildNode=Element.selectSingleNode("./"&Trim(ChildNodeObj))
      End If
    End If
  End Property
 
  '读取最后的错误信息
  Public Property Get ErrInfo
    ErrInfo=fErrInfo
  End Property

  '给xml内容
  Public Property Get xmlText(byVal ElementOBJ)
    xmlText=""
    If fopen=false Then Exit Property
   
    Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
    If ElementOBJ Is Nothing Then Set ElementOBJ=XmlDom

    xmlText=ElementOBJ.xml
  End Property
 
  '=================================================================
  '类初始化
  Private Sub Class_Initialize()
    Set XmlDom=CreateObject("Microsoft.XMLDOM")
    XmlDom.preserveWhiteSpace=true
   
    Set fNode=Nothing
    Set fANode=Nothing

    fErrInfo=""
    fFileName=""
    fopen=false
  End Sub

  '类释放
  Private Sub Class_Terminate()
    Set fNode=Nothing
    Set fANode=Nothing
    Set XmlDom=nothing
    fopen=false
  End Sub
 
  '=====================================================================
  '建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址
  '返回根结点
  Function Create(byVal RootElementName,byVal XslUrl)
    Dim PINode,RootElement
   
    Set Create=Nothing
   
    If (XmlDom Is Nothing) Or (fopen=true) Then Exit Function
   
    If Trim(RootElementName)="" Then RootElementName="Root"
   
    Set PINode=XmlDom.CreateProcessingInstruction("xml", "version=""1.0""  encoding=""GB2312""")
    XmlDom.appendChild PINode

    Set PINode=XMLDOM.CreateProcessingInstruction("xml-stylesheet", "type=""text/xsl"" href="""&XslUrl&"""")
    XmlDom.appendChild PINode

    Set RootElement=XmlDom.createElement(Trim(RootElementName))
    XmlDom.appendChild RootElement
   
    Set Create=RootElement
   
    fopen=True
    set fNode=RootElement
  End Function
 
  '开打一个已经存在的XML文件,返回打开状态
  Function Open(byVal xmlSourceFile)
    Open=false
   
    xmlSourceFile=Trim(xmlSourceFile)
    If xmlSourceFile="" Then Exit Function

    XmlDom.async = false
    XmlDom.load xmlSourceFile
   
    fFileName=xmlSourceFile

    If not IsError Then
       Open=true
       fopen=true
    End If
  End Function
 
  '关闭
  Sub Close()
    Set fNode=Nothing
    Set fANode=Nothing

    fErrInfo=""
    fFileName=""
    fopen=false
  End Sub
 
  '读取一个NodeOBJ的节点Text的值
  'NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode
  Function getNodeText(byVal NodeOBJ)
    getNodeText=""
    If fopen=false Then Exit Function
   
    Set NodeOBJ=ChildNode(null,NodeOBJ,false)
    If NodeOBJ Is Nothing Then Exit Function

    If Lcase(NodeOBJ.nodeTypeString)="element" Then
      set fNode=NodeOBJ
    Else
      set fANode=NodeOBJ
    End If
    getNodeText=NodeOBJ.text
  End function
 
  '插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。
  'IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型
  '插入成功就返回新插入这个节点
  'BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象
  Function InsertElement(byVal BefelementOBJ,byVal ElementName,byVal ElementText,byVal IsFirst,byVal IsCDATA)
    Dim Element,TextSection,SpaceStr
    Set InsertElement=Nothing
   
    If not fopen Then Exit Function

    Set BefelementOBJ=ChildNode(XmlDom,BefelementOBJ,false)
    If BefelementOBJ Is Nothing Then Exit Function
   
    Set Element=XmlDom.CreateElement(Trim(ElementName))
   
    'SpaceStr=vbCrLf&TabStr(BefelementOBJ)
    'Set STabStr=XmlDom.CreateTextNode(SpaceStr)
   
    'If Len(SpaceStr)>2 Then  SpaceStr=Left(SpaceStr,Len(SpaceStr)-2)
    'Set ETabStr=XmlDom.CreateTextNode(SpaceStr)
   
    If IsFirst=true Then
      'BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild
      BefelementOBJ.InsertBefore Element,BefelementOBJ.firstchild
      'BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild
    Else
      'BefelementOBJ.appendChild STabStr
      BefelementOBJ.appendChild Element
      'BefelementOBJ.appendChild ETabStr
    End If

    If IsCDATA=true Then
      set TextSection=XmlDom.createCDATASection(ElementText)
      Element.appendChild TextSection
    ElseIf ElementText<>"" Then
      Element.Text=ElementText
    End If

    Set InsertElement=Element
    Set fNode=Element
  End Function
 
  '在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性
  '如果已经存在名为AttributeName的属性对象,就进行修改。
  '返回插入或修改属性的Node
  'ElementOBJ可以是Element对象或名,为null就取当前默认对象
  Function setAttributeNode(byVal ElementOBJ,byVal AttributeName,byVal AttributeText)
    Dim AttributeNode
    Set setAttributeNode=nothing

    If not fopen Then Exit Function
  
    Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
    If ElementOBJ Is Nothing Then Exit Function
  
    Set AttributeNode=ElementOBJ.attributes.getNamedItem(AttributeName)
    If AttributeNode Is nothing Then
       Set AttributeNode=XmlDom.CreateAttribute(AttributeName)
       ElementOBJ.setAttributeNode AttributeNode
    End If
    AttributeNode.text=AttributeText
   
    set fNode=ElementOBJ
    set fANode=AttributeNode
    Set setAttributeNode=AttributeNode
  End Function
 
  '修改ElementOBJ节点的Text值,并返回这个节点
  'ElementOBJ可以对象或对象名,为null就取当前默认对象
  Function UpdateNodeText(byVal ElementOBJ,byVal NewElementText,byVal IsCDATA)
    Dim TextSection

    set UpdateNodeText=nothing
    If not fopen Then Exit Function
   
    Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
    If ElementOBJ Is Nothing Then Exit Function

    If IsCDATA=true Then
      set TextSection=XmlDom.createCDATASection(NewElementText)
      If ElementOBJ.firstchild Is Nothing Then
        ElementOBJ.appendChild TextSection
      ElseIf LCase(ElementOBJ.firstchild.nodeTypeString)="cdatasection" Then
        ElementOBJ.replaceChild TextSection,ElementOBJ.firstchild
      End If
    Else
      ElementOBJ.Text=NewElementText
    End If
   
    set fNode=ElementOBJ
    Set UpdateNodeText=ElementOBJ
  End Function
 
  '返回符合testValue条件的第一个ElementNode,为null就取当前默认对象
  Function getElementNode(byVal ElementName,byVal testValue)
    Dim Element,regEx,baseName
   
    Set getElementNode=nothing
    If not fopen Then Exit Function

    testValue=Trim(testValue)
    Set regEx=New RegExp
    regEx.Pattern="^[A-Za-z]+"
    regEx.IgnoreCase=true
    If regEx.Test(testValue) Then testValue="/"&testValue
    Set regEx=nothing
   
    baseName=LCase(Right(ElementName,Len(ElementName)-InStrRev(ElementName,"/",-1)))

    Set Element=XmlDom.SelectSingleNode("//"&ElementName&testValue)

    If Element Is Nothing Then
      'Response.write ElementName&testValue
      Set getElementNode=nothing
      Exit Function
    End If

    Do While LCase(Element.baseName)<>baseName
      Set Element=Element.selectSingleNode("..")
      If Element Is Nothing Then Exit Do
    Loop
       
    If LCase(Element.baseName)<>baseName Then
      Set getElementNode=nothing
    Else
      Set getElementNode=Element
      If Lcase(Element.nodeTypeString)="element" Then
        Set fNode=Element
      Else
        Set fANode=Element
      End If
    End If
  End Function
 
  '删除一个子节点
  Function removeChild(byVal ElementOBJ)
    removeChild=false
    If not fopen Then Exit Function

    Set ElementOBJ=ChildNode(null,ElementOBJ,false)
    If ElementOBJ Is Nothing Then Exit Function
   
    'response.write ElementOBJ.baseName

    If Lcase(ElementOBJ.nodeTypeString)="element" Then
      If ElementOBJ Is fNode Then set fNode=Nothing
      If ElementOBJ.parentNode Is Nothing Then
        XmlDom.removeChild(ElementOBJ)
      Else
        ElementOBJ.parentNode.removeChild(ElementOBJ)
      End If
      removeChild=True
    End If
  End Function
 
  '清空一个节点所有子节点
  Function ClearNode(byVal ElementOBJ)
     set ClearNode=Nothing
     If not fopen Then Exit Function
   
     Set ElementOBJ=ChildNode(null,ElementOBJ,false)
     If ElementOBJ Is Nothing Then Exit Function
    
     ElementOBJ.text=""
     ElementOBJ.removeChild(ElementOBJ.firstchild)
    
     Set ClearNode=ElementOBJ
     Set fNode=ElementOBJ
  End Function

  '删除子节点的一个属性
  Function removeAttributeNode(byVal ElementOBJ,byVal AttributeOBJ)
    removeAttributeNode=false
    If not fopen Then Exit Function
   
    Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
    If ElementOBJ Is Nothing Then Exit Function
   
    Set AttributeOBJ=ChildNode(ElementOBJ,AttributeOBJ,true)
    If not AttributeOBJ Is nothing Then
      ElementOBJ.removeAttributeNode(AttributeOBJ)
      removeAttributeNode=True
    End If
  End Function

  '保存打开过的文件,只要保证FileName不为空就可以实现保存
  Function Save()
    On Error Resume Next
    Save=false
    If (not fopen) or (fFileName="") Then Exit Function
   
    XmlDom.Save fFileName
    Save=(not IsError)
    If Err.number<>0 then
      Err.clear
      Save=false
    End If
  End Function

  '另存为XML文件,只要保证FileName不为空就可以实现保存
  Function SaveAs(SaveFileName)
    On Error Resume Next
    SaveAs=false
    If (not fopen) or SaveFileName="" Then Exit Function
    XmlDom.Save SaveFileName
    SaveAs=(not IsError)
    If Err.number<>0 then
      Err.clear
      SaveAs=false
    End If
  End Function

  '检查并打印错误信息
  Private Function IsError()
    If XmlDom.ParseError.errorcode<>0 Then
       fErrInfo="<h1>Error"&XmlDom.ParseError.errorcode&"</h1>"
       fErrInfo=fErrInfo&"<B>Reason :</B>"&XmlDom.ParseError.reason&"<br>"
       fErrInfo=fErrInfo&"<B>URL &nbsp; &nbsp;:</B>"&XmlDom.ParseError.url&"<br>"
       fErrInfo=fErrInfo&"<B>Line &nbsp; :</B>"&XmlDom.ParseError.line&"<br>"
       fErrInfo=fErrInfo&"<B>FilePos:</B>"&XmlDom.ParseError.filepos&"<br>"
       fErrInfo=fErrInfo&"<B>srcText:</B>"&XmlDom.ParseError.srcText&"<br>"
       IsError=True
    Else
      IsError=False
    End If
  End Function
End Class
%>

相关文章:

对HDS AMS 2000+巡检案例

1. 使用工具&#xff1a;笔记本&#xff0c;网线一根&#xff0c; 2. 使用软件&#xff1a;vmware虚拟机&#xff08;安装XP P2系统&#xff0c;最好为P3&#xff09;&#xff0c;HSNM2-1152-W-CLI-P01.exe&#xff08;AMS 200管理软件&#xff09;&#xff0c;jre…

用Python实现坦克大战游戏 | 干货贴

作者 | 李秋键出品 | AI科技大本营&#xff08;rgznai100&#xff09;《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上&#xff0c;推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题&#xff0c;属于策略型联机类。同时也是FC平台上少有的内建关卡…

SPU、SKU、ARPU是什么,我来记录一下我的理解

在电商系统里经常会提到“商品”、“单品”、“SPU”、“SKU”这几个词&#xff0c;那么这几个词到底是什么意思呢&#xff1f;既然不知道是什么&#xff0c;那么我们就查一下&#xff1a;SPU Standard Product Unit &#xff08;标准化产品单元&#xff09;&#xff0c;SKUst…

用C#操纵IIS(代码)

using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text;/*** author 吴海燕* email wuhy80-usualyahoo.com* 2004-6-25 第一版*/ namespace Wuhy.ToolBox{/// <summary>/// 这个类是静态类。…

linux 内核参数调整说明

linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。3. /proc/sys/net/ipv4…

Java 最高均薪 19015 元! 9 月程序员工资出炉,你拖后腿了吗?

在全员争当码农的时代&#xff0c;如果你也想学一门编程语言&#xff0c;那么&#xff0c;我要告诉你&#xff0c;Java 是编程语言中不可撼动的王者。有点难理解&#xff1f;先看个排行榜???? 来自权威开发语言排行榜 TIOBE 的数据&#xff08;截止到 2020 年 4 月&#x…

java 基础知识八 正则表达式

正则表达式 是一种可以用于模式匹配和替换的规范&#xff0c; 一个正则表达式就是由普通的字符&#xff08;例如字符a到z&#xff09;以及特殊字符&#xff08;元字符&#xff09;组成的文字模式&#xff0c; 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为…

PHP中Session的使用

启用配置//修改php.ini中的session.auto_start 0 为 session.auto_start 1session_start();$_SESSION[username]"HM";

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》&#xff08;Copyright © 1995, 1996, 1997 by Rex Page&#xff0c;有人翻译为Haskell二十四学时教程&#xff0c;该书如果不用于赢利&#xff0c;可以任意发布&#xff0c;但需要保留他们的copyright&#xff09;这本书是学习 Ha…

图神经网络快速爆发,最新进展都在这里了

译者 | 刘畅出品 | AI科技大本营&#xff08;rgznai100&#xff09;近年来&#xff0c;图神经网络&#xff08;GNNs&#xff09;发展迅速&#xff0c;最近的会议上发表了大量相关的研究论文。本文作者正在整理一个GNN的简短介绍和最新研究报告的摘要。希望这对任何准备进入该领…

css去掉a标签点击后的虚线框

outline是css3的一个属性&#xff0c;用的很少。 声明&#xff0c;这是个不能兼容的css属性&#xff0c;在ie6、ie7、遨游浏览器都不兼容。 outline控制的到底是什么呢&#xff1f; 当聚焦a标签的时候&#xff0c;在a标签的区域周围会有一个虚线的框&#xff0c;这个框不同于bo…

在SQL Server中保存和输出任意类型的文件

我们可以把任意类型的文件保存到SQL Server中&#xff0c;在进行例子之前&#xff0c;先建立测试用表格&#xff0c;TestFile.sql&#xff1a;if exists (select * from dbo.sysobjects where id object_id(N[dbo].[TestFiles]) and OBJECTPROPERTY(id, NIsUserTable) 1) dro…

工作中InnoDB引擎数据库主从复制同步心得

近期将公司的MySQL架构升级了&#xff0c;由原先的一主多从换成了DRBDHeartbeat双主多从&#xff0c;正好手上有一个电子商务网站新项目也要上线了&#xff0c;用的是DRBDHeartbeat双主一从&#xff0c;由于此过程还是有别于以前的MyISAM引擎的&#xff0c;所以这里也将其心得归…

面试官:因为这个语言,我淘汰了90%的人!

很多人都有这样的经历&#xff1a;大量重复性工作&#xff1b;日报、周报、各种报&#xff0c;无穷无尽&#xff1b;不计其数的数据提取琐碎繁杂的事务让工作的效率极低。如果可以一键完成就好了。对这些问题来说&#xff0c;最高效的解决途径就是 Python。1991 年&#xff0c;…

SQL Server不能启动

SQL Server不能正常启动 I had a similar issue after uninstalling Visual Studio 2010 (which autmatically came with a Visual Studio Express 2013 install). I solved it by going through the follwing steps. Installing Visual Studio 2010 shell from here: https://…

ASP.NET 配置节架构

ASP.NET 配置节架构包含控制 ASP.NET Web 应用程序行为的元素。如果为属性指定了默认值&#xff0c;则该默认值是在 Machine.config 文件中设置的&#xff0c;该文件的路径是 systemroot/Microsoft.NET/Framework/versionNumber/CONFIG/Machine.config。 <configuration>…

IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选

10月12日&#xff0c;IEEE宣布马里兰大学终身教授刘国瑞&#xff08;K. J. Ray Liu&#xff09;当选为2021年IEEE主席&#xff0c;他也是首位当选IEEE主席的华人学者&#xff0c;他将在明年1月开始接任现任IEEE主席Susan K. Kathy Land的职务。 在此次IEEE候选主席竞选中&#…

Visual C++ 2010 简介

VC是用来创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序 原文地址&#xff1a;http://msdn.microsoft.com/zh-cn/library/60k1461a%28vvs.100%29.aspx提供了强大而灵活的开发环境&#xff0c;用于创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序。您可以在…

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样&#xff0c;在开发基于UDP的应用程序时&#xff0c;其主要流程如下&#xff1a; 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多。对比面向连接的TCP程序&#xff0c;服务端少了listen和accept函数。前面我们也说过…

四款5G版iPhone 12齐发,苹果股价却应声而跌

整理 | 郑丽媛、屠敏题图 | 东方IC来源 | CSDN&#xff08;CSDNnews&#xff09;真快&#xff0c;又见面了。北京时间 10 月 14 日凌晨 1 点&#xff0c;Apple 举办的新品发布会如约而至。今年有关 iPhone 新品的到来有些迟&#xff0c;好在「5G just got real」&#xff0c;万…

Linux编译器GCC的使用

嵌入式Linux编译器GCC的使用 1、GCC概述 作为自由软件的旗舰项目&#xff0c;Richard Stallman在十多年前刚开始写作GCC的时候&#xff0c;还只是仅仅把它当作一个C程序语言的编译器&#xff0c;GCC的意思也只是GNU C Compiler而已。 经过了这么多年的发展&#xff0c;GCC已经不…

jquery兼容IE和火狐下focus()事件

<input type"text" id"my" name"my" /> <script type"text/javascript">$("#my").focus(); </script> 上面的代码在IE下是没有任何问题的,但是不兼容FF,在FF没有反应解决办法:兼容写法 IE和FF下focus()事…

Access-Control-Allow-Origin这个header这个头不能设置通配符域名

这个header属性&#xff0c;要么设置为*&#xff0c;即任何域名来源都行&#xff0c;要么就只能设置为一个或多个&#xff0c;确定的域名&#xff0c;不能使用通配符域名转载于:https://www.cnblogs.com/abcbuzhiming/p/6478910.html

MySQL Xtrabackup备份和恢复

简介 Xtrabackup是由percona提供的mysql数据库备份工具&#xff0c;据官方介绍&#xff0c;这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点&#xff1a;(1)备份过程快速、可靠&#xff1b;(2)备份过程不会打断正在执行的事务&#xff1b;(3)能够基…

​吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

.NET中获取电脑名,IP地址,当前用户

在.NET中获取一台电脑名&#xff0c;IP地址及当前用户名是非常简单&#xff0c;以下是我常用的几种方法,如果大家还有其它好的方法&#xff0c;可以回复一起整理&#xff1a; 1. 在ASP.NET中专用属性&#xff1a; 获取服务器电脑名: Page.Server.ManchineName 获取用户信息:…

SpringMVC注解整理

2019独角兽企业重金招聘Python工程师标准>>> 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包)。 <context:component-scan base-package"cn.test"/> Configuration把一个类作为一个IoC容器&#xff0c;它的某个方法头上如果…

Facebook是如何做搜索的?

作者 | 一块小蛋糕来源 | NewBeeNLP今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。不得不说&#xff0c;F家的文章还是一如既往浓浓的工业风&#xff0c;这篇论文从工程角度讲解了一个召回的全流程&#xff0c;不管是做语义信息检…

JavaScript[对象.属性]集锦

作者&#xff1a; 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个HTML文档的顶层对象.? 属性? frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.? feames…

c++ hook 钩子的使用介绍

一、基本概念&#xff1a; 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序截…