




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 基于RS485和VB的远程温度采集系统 信息工程学院生医0701摘要:本系统以RS485总线和VB上位机控制台为核心,构成了一个可远达1200M范围内的远程温度采集网络。系统通过双绞线作为信号传输媒介,引入RS485总线信号传输的一些处理措施,具有良好的信息传输准确性和系统抗干扰性。另外,本系统可以在RS485总线上挂接最多由51单片机和DS18B20构成的32个温度采集节点,并且系统密切与RS485总线的“轮询”思想和VB上位机控制台相结合,因此可以说是构成了真正意义上的远程智能温度采集网络!该系统可以广泛应用在需要对温度进行实时和全天候观察的各种场合,具有较高的实际应用价值!关键词:RS
2、485总线 轮询 VB上位机 51单片机 DS18B20 正文 RS485总线接口做为多点、差分数据传输的规范,现已成为业界应用较为广泛的标准通信接口之一。RS485标准只对接口的电气特性做出了规定,而不涉及接插件、电缆或协议,因此,用户可在此基础上建立自己的高层通信协议。在工业自动控制中,计算机通过串口与单片机系统之间进行通信的应用越来越广泛。一般情况下,控制系统需要一个高级语言开发的相当于控制台的用户界面,用来进行参数设置,发送指令和系统检测,VB在这一领域用着很强的优势。从控制台发出的指令经过计算机串口传送给单片机系统,此时VB携带的通信控件MSComm起到了桥梁作用,给编程者带来了极大
3、的方便。DALLAS公司生产的 DS18B20可组网数字温度传感器具有“一线总线”接口、测温范围 55125、固有测温分辨率0.5、体积小、耐磨耐碰等特点,非常适合与传统的51单片机构成温度采集节点。将RS485总线及“轮询思想”、VB上位机控制台、51单片机和DS18B20构成的温度采集节点有机的结合起来就可以构成一个远程的智能温度采集系统。RS485总线1.1 RS485总线介绍电子工业协会 (EIA) 于 1983年制订并发布 RS-485 标准,并经通讯工业协会( TIA)修订后命名为 TIA/EIA-485-A,习惯地称之为 RS-485标准。RS-485标准是为弥补 RS-232
4、通信距离短、速率低等缺点而产生的。 RS-485标准只规定了平衡发送器和接收器的电特性,而没有规定接插件、传输电缆和应用层通信协议。1.2 RS485总线独特之处RS-485标准与 RS-232不一样,数据信号采用差分传输方式( Differential Driver Mode),也称作平衡传输,它使用一对双绞线,将其中一线定义为 A,另一线定义为 B,如图1-1所示。 图 1-1通常情况下,发送发送器 A、B之间的正电平在+2+6V,是一个逻辑状态;负电平在 -2-6V,是另一个逻辑状态。另有一个信号地 C。在 RS-485器件中,一般还有一个“使能”控制信号。“使能”信号用于控制发送器与传
5、输线的切断与连接,当“使能”端起作用时,发送发送器处于高阻状态,称作“第三态”,它是有别于逻辑“ 1”与“ 0”的第三种状态。 对于接收发送器,也作出与发送发送器相对的规定,收、发端通过平衡双绞线将 A-A与 B-B对应相连。当在接收端 A-B之间有大于+200mV的电平时,输出为正逻辑电平;小于-200mV时,输出为负逻辑电平。在接收发送器的接收平衡线上,电平范围通常在 200mV至 6V之间。参见图 1-2所示。 图1-2定义逻辑 1(正逻辑电平)为 BA的状态,逻辑 0(负逻辑电平)为 AB的状态, A、B之间的压差不小于 200mV。 TIA/EIA-485串行通讯标准的性能如表格 1
6、-2所示:规格 TIA/EIA-485 传输模式 平衡 电缆长度90Kbps 4000 ft(1200m) 电缆长度10Mbps 50 ft(15m) 数据传输速度 10 Mbps 昀大差动输出 6V 昀小差动输出 1.5V 接收器敏感度 0.2 V 发送器负载(欧姆) 60 昀大发送器数量 32 单位负载 昀大接收器数量 32 单位负载 RS-485标准的最大传输距离约为 1219米,最大传输速率为 10Mbps。通常,RS-485网络采用平衡双绞线作为传输媒体。平衡双绞线的长度与传输速率成反比,只有在 20kbps速率以下,才可能使用规定昀长的电缆长度。只有在很短的距离下才能获得昀高速率传
7、输。一般来说,15米长双绞线昀大传输速率仅为 1Mbps。RS-485网络采用直线拓朴结构,需要安装 2个终端匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般取值为 120)。在矩距离、或低波特率波数据传输时可不需终端匹配。 RS485转换器及RS-485网络直线拓扑结构1.3.1 RS485转换器外形图1.3.2 RS485转换器内部电路图1.3.3 RS-485网络直线拓扑结构下位机RS485通信接口电路较为理想的下位机RS485通信接口电路本电路采用 MAX485作为 RS485总线的驱动芯片,如图1-3所示,将/RE和DE短接,由MCS-51的P10端口经反相器控制半双工通信时接收和发
8、送的状态切换。三极管Q1及电阻R1、R2构成反向电路;R3、R4为总线空闲时的上拉电阻,抗随机干扰作用;R7为阻抗匹配电阻,以减小信号反射;R5、R6及四个快恢复稳压管D1D4均为保护和抗干扰作用。 图1-3实验室用下位机RS485通信接口电路在环境不是十分恶劣的现场中,可以采用图1-4中的RS485通信接口电路,图1-4实际上就是图1-3的精简版。图1-4RS485总线软件设计8051串行口的控制寄存器SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:M0和SM1为工作方式选择位,可选择四种工作方式:SM2,多机通信控制位,主要用于方式2和方式3。当接
9、收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。TB8/RB8在方式2或方式3中,是发送数据的第九位,在多机通信中,作为地址帧/数据帧的标志位。RS485总线的程序实现流程所有从机的SM2位置1,处于接收地址帧状态。主机发送一地址帧,其中8位是地址,第9位为地址/数据的区分标志,该位置1表示该帧为地址帧。
10、所有从机收到地址帧后,都将接收的地址与本机的地址比较。对于地址相符的从机,使自己的SM2位置0(以接收主机随后发来的数据帧),并把本站地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据帧不予理睬。主机收到从机应答地址后,确认地址是否相符,如果地址不符,发复位信号(数据帧中TB8=1);如果地址相符,则清TB8,开始发送数据.在前一步的基础上,如果从机收到的是复位命令则回到监听地址状态(SM2=1)。否则开始接收数据和命令,并相应的向上位机传送数据!从机发送数据结束后,置第9位(TB8)为1,再发送一帧校验和给上位机,作为从机数据传送结束的标志。 (可以忽略)主机接
11、收数据时先判断数据接收标志(RB8),若RB8=1,表示数据传送结束,并比较此帧校验和,若正确则回送正确信号00H,此信号命令该从机复位(即重新等待地址帧);若校验和出错,则发送FFH,命令该从机重发数据。若接收帧的RB8=0,则存数据到缓冲区,并准备接收下帧信息。(可以忽略)从机发送或接收完毕后置SM2=1,继续地址侦听。主机发送或接收完毕后修改MSComm的Settings属性为”9600,M,8,1”,并退出本次通信。发送另一从机地址帧准备进行一次通信。RS485总线接口程序清单#include#include#include#define uchar unsigned char#def
12、ine uint unsigned intsbit RT=P20; / MAX485收发控制位,低-接收,高发送 uchar qian,bai,shi,ge,data_crc; uint flag; /flag为从机地址验证正确标志位 void delay(uint z) uint x,y;for(x=0;xz;x+) for(y=0;yThe second bitwhile(TI!=1);TI=0;SBUF=48+bai;/向主机发送信息 while(TI!=1);TI=0;SBUF=48+shi;/向主机发送信息 while(TI!=1);TI=0;SBUF=48+ge;/向主机发送信息
13、while(TI!=1);TI=0;SBUF= ;/向主机发送信息 while(TI!=1);TI=0;RT=0;TB8=0; if(SBUF=0 x30) /预定的结束通信指令 TB8=0; /其实这里我们可以不管TB8,因为初始化的时候TB8=0;RT=0;SM2=1; flag=0;P1=0 xff; ES=1; /*主程序部分*/void main(void) TMOD=0 x20; TL1=0 xfd; TH1=0 xfd; PCON=0 x00; /SCON=0 xf0; SM0=1 ; SM1=1; SM2=1; REN=1; EA=1; ES=1; TR1=1; RT=0; /
14、 接收/发送数据控制位,初始化为接收 while(1) VB上位机控制台AT89S52与电脑的通信接口芯片比较:综合观察比较,我们可以利用“校验位”模拟单片机的TB8/RB8.具体就是发送地址的时候校验位设定为”M”(值为1),发送指令的时候校验位设定为”S”(值为0);VB MSComm通信控件的属性及参数设置Commport设置打开端口号位1或2,3,4;Handshaking=0时无握手协议;InBufferSize=1024,接收缓冲区中字节数;InputLen=1,设置一次接收缓冲字节数位1;InputMode=0表示数据通过Input属性以文本形式取回,为1表示数据通过Input属
15、性以二进制形式取回;OutBufferSize=512,设置并返回传输缓冲区的大小;Rhtreshold=1,在发生接收事件后并触发OnComm事件之前,设置并返回要接收的字节数。即接收缓冲区收到每一个字节后都会使MSComm控件产生OnComm事件。RTSEnable=False,若设为True则会发送信息到调制解调器,而不是通过串口通信;Setting=”9600,N,8,1”,设置并返回波特率、奇偶校验、数据位、停止位参数。9600,N,8,1即波特率为9600,无奇偶校验,8个数据位,1个停止位;Sthreshold=0( 缺省值),数据传输事件不会产生OnComm事件。若设置Sthr
16、eshold属性为1,当传输缓冲区完全为空时,MSComm控件产生OnComm事件。主从式多机通信中,必须为每个从机分配不同的地址,主机通过发送地址与从机取得联络后再与该从机进行数据帧或命令帧的交互,MCS-51中可通过灵活地控制串行口控制器 SCON的 SM2位和发送/接收的第 9位 TB8/RB8来区分地址或数据信息。本系统中以 PC机为主机,使用 VB6.0的 MSComm控件与单片机通信,PC机要区分下发的是地址信息还是数据信息,是通过设置 MSComm控件Settings属性中的奇偶校验位来巧妙实现的。发送地址时设置为 M,即 Settings =“9600,M, 8,1”,则主机发
17、送地址时置发送的第 9位为 1;发送数据时,设置为 S,则主机在每个字节数据时置发送的第 9位为 0;由于上位机中数据的发送和接收涉及到的情形比较多,因此在这里不详加介绍。关于这方面比较好的论文有深圳职业技术学院温晓军的VB在串行通信中的应用,当然该论文讲得比较浅显,如果想要更深入的了解学习必须参看更多其它相关资料。VB上位机控制台及软件特色用VB6.0编写的上位机控制台如图1-5所示。 图1-5软件特色解析:“通信设置”区域该区域可进行串口号、波特率、数据位数、停止位数以及地址/数据帧设置。这些是通过MSComm控件的Settings属性来实现的。通常,在某些情况下我们会结合下位机进行波特率
18、的修改,其它几个参数保持不变。“节点检测”区域该区域可进行下位机节点是否正常性检查,做为后面节点选择的依据。在实际操作的时候是这样实现的:上位机发送从机地址并开启一个定时器,如果在500ms内收到了从机的应答地址则弹出提示框“正常工作!”,否则弹出提示框“非正常工作!”。“下位机节点”区域该区域可进行下位机节点选择、“轮询”时间间隔设置和目标数据以Excel保存的名称和位置设置。在这里可以将所选择的下位机节点一天24小时所采集的温度数据连续保存在所指定的Excel表格中,以供后续的数据分析。该区域功能的实现主要通过数组及相应算法、定时器、VB调用Excel表格的灵活组合应用来完成的。实现效果如
19、图1-6、图1-7所示。图1-6图1-7(4)“节点显示单元”区域通过该区域可以实时的观察所选择节点的温度数据。(5)其它特性该上位机软件还具有端口开闭检测能力和突发事件处理能力。这里着重介绍一下突发事件处理能力。该上位机软件的突发事件处理能力体现在当选择的某一个下位机节点出现崩溃的时候可以很好的进行应急处理,从而避免对整个系统造成影响。该功能同样是通过定时器的灵活应用来实现的。下位机温度采集节点微处理器目前微处理器领域最火爆的莫过于32位的ARM,但出于本系统对微处理要求不高和性价比的考虑,因此选择传统的8051单片机.。本系统选择国产宏晶STC89C52RC,不选择AT89S52是因为两者
20、性能基本一样,但STC价格便宜一半。STC89C52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,512 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,3个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。可以看出STC89C52完全满足系统对微处理的要求。DS18B20DS18B20特性简介DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可以轻松的组建传感器网络,为测量系统的构建引入全
21、新概念。现在新一代DS18B20体积更小、更经济、更灵活,使你可以充分发挥“一线总线”的长处。DS18B20的具体特性如下:独特的单线接口仅需一个端口引脚进行通讯简单的多点分布应用无需外部器件可通过数据线供电零待机功耗测温范围-55+125摄氏度,以0.5摄氏度递增912位可选分辨率温度数字量转换时间200ms(典型值)用户可定义的非易失性温度报警设置应用包括温度控制、工业系统、消费品、温度计或任何热感测系统DS18B20典型应用电路上图是通过VDD引脚引入一个外部电源,这样做的好处是I/O线上不需要加强上拉,而且总线控制器不用在温度转换期间总保持高电平。这样在转换期间可以允许在单线总线上进行
22、其它数据往来。另外,在单线总线上可以挂任意多片DS18B20,并且如果它们使用外部电源的话,就可以先发一个Skip ROM命令,再接一个Convert T命令,让它们同时进行温度转化。注意当加上外部电源时,GND引脚不能悬空。51单片机驱动DS18B20温度转化流程图51单片机和DS18B20温度采集部分程序清单#include #include #include #include #define uchar unsigned char#define uint unsigned intsbit DS = P32;/DS18b20的数据线端口sbit key = P33;uchar code t
23、able0=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xbf;/ 0到9与“-”编码 uchar code table3= 0 x40, 0 x79, 0 x24, 0 x30,0 x19,0 x12,0 x02,0 x78,0 x00,0 x10, 0 x08, 0 x03, 0 x46, 0 x21,0 x06,0 x0E,0 xff;/共阳带小数点段选 uchar code table18=0 x28,0 x1e,0 x45,0 xe9,0 x00,0 x00,0 x00,0 xb7;/两1820的ROM编
24、码,可在单个时用read rom读出uchar code table28=0 x28,0 x87,0 x3f,0 x08,0 x02,0 x00,0 x00,0 xc9;uchar zf_flag=0,temph,templ,ge,shi,bai,qian;uchar choose=0;/1-wire总线,寻访不同1820的标志位int temper;/温度真实值/*函数名称:delay_us(uint t)入口参数: t出口参数:无注备:此程序是为了1wire总线写时的us级延时而写的;其中在外部晶振为11.0592MHz时,每次进入函数大约要18us左右,每次循环大约13us左右*/voi
25、d delay_us(uint t)uint i;for(i=0;it;i+);/*函数名称:delay_nms(uint t)入口参数: t出口参数:无注备: 毫秒级软件延时*/void delay_nms(uint t)uint i;uchar j;for(i=0;it;i+)for(j=0;j110;j+);/*函数名称:reset_1820()入口参数:无出口参数:bit一位数: 返回1,初始化成功;返回0,初始化失败注备:这里主要要注意的是延时的问题*/bit resert_1820()DS = 1;_nop_();/MCU将DS拉低后,要保持至少大于1us,数据手册上说的。_nop
26、_();/这里为确保稳定延时2us左右DS = 0;delay_us(55);/这里延时大约750us左右DS = 1;/delay_us(2);/这里大约50us左右 *适当调整!delay_us(3);if(!DS)delay_us(50); /这个延时很重要!650us!*可能有点偏长!DS = 1; /一定要在初始化完成后将DS置1,以释放总线return 1;elsereturn 0;/*函数名称:write_bit(bit wei)入口参数:bit wei出口参数:无注备:*/void write_bit(bit wei)DS = 1;DS = 0;_nop_(); /MCU将DS
27、拉低后,要保持至少大于1us,数据手册上说的。_nop_(); /这里为确保稳定延时2us左右if(wei)DS = 1;elseDS = 0;delay_us(6); /*大概81usDS = 1;_nop_();/*函数名称:read_bit()入口参数:无出口参数:bit 一位注备:*/bit read_bit()/初期写程序出问题处!DS = 1;DS = 0; _nop_();_nop_();/MCU将DS拉低后,要保持至少大于1us,数据手册上说的。 /这里为确保稳定延时2us左右 DS=1; /这里必须拉高:让MCU释放总线,好让DS18B20利用总线回送数据_nop_();_n
28、op_(); /等待一定时间,让DS18B20回送的数据稳定_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();return DS;/*函数名称:write_byte(uchar byte)入口参数:byte出口参数:无注 备:DB18B20写入数据或读出数据都是从最低位开始的*/void write_byte(uchar byte)bit flag1;uchar i,temp;temp = byte;for(i=0;i1);/DB18B20写入数据或读出数据都是从最低位开始的flag1 = CY; /*这种方式还是不错的!*/write_bit(
29、flag1);/*函数名称:read_byte()入口参数:无出口参数:byte型注 备:DB18B20写入数据或读出数据都是从最低位开始的*/uchar read_byte()bit flag2;uchar i,j,temp;for(i=0;i1);flag2 = read_bit();if(flag2) /*中间变量对一个位进行操作!*/j = 0 x80;else j = 0 x00;temp = temp|j;return temp;/*函数名称:uintconversion(uchar h_byte,uchar l_byte)入口参数:uchar h_byte,uchar l_byt
30、e出口参数:uint型注 备:将DB18B20读出的数据转化为真正的温度值*/uint conversion(uchar h_byte,uchar l_byte)int wendu;float tt;/注意数据类型对运算的影响!if(h_byte7|h_byte=7)zf_flag = 0;/温度正负标志位:1,为负;0,为正wendu = h_byte;/将读入的带字符的高字节放入int型温度变量中wendu = wendu8;/将其左移八位,让其进入高字节wendu = wendu|l_byte;/并与温度的低字节相或,凑成整型值tt = wendu*0.0625;/乘以最小分辨率,获得真
31、正温度值wendu = tt*10+0.5;/为了能得到温度的第一小数位,将其乘10,并加上0.5以四舍五入/近似操作elsezf_flag = 1;/温度正负标志位:1,为负;0,为正wendu = h_byte;wendu = wendu8;wendu = wendu|l_byte;wendu = (wendu)+1;/因为从1820中读出的是补码,所以对于温度值要取反加1,以获得其绝对值tt = wendu*0.0625;/注意数据类型对运算的影响!wendu = tt*10+0.5;/教训:我在这里原来写的是:wendu=wendu*0.0625;return wendu;void m
32、ain()uchar i;while(1)resert_1820(); /初始化1820 write_byte(0 xCC); /单个1820,跳过匹配ROMwrite_byte(0 x44); /发送温度转化命令for(i=0;i20;i+) /这里要用数码管显示温度,就干脆用来扫描数码管show(qian,bai,shi,ge);resert_1820(); /初始化1820 write_byte(0 xCC); /单个1820,跳过匹配ROMwrite_byte(0 xBE); /读暂存器中温度的值templ = read_byte(); /读暂存器中温度的低字节temph = read
33、_byte(); /读暂存器中温度的带符号的高字节temper=conversion(temph,templ);/将读回来温度的值转化为实际真值qian= temper/1000; /千bai= temper%1000/100; /百shi = temper/100/10; /十 ge=temper%10; /个结束语本设计中的RS485总线接口和上位机控制台被用于工厂现场中,实践证明性能稳定,通信可靠。因此,可直接移植于其它工业自动控制设计中。参考文献(1)、Visual Basic 实用教程(第二版) 郑阿齐 电子工业出版社 (2)、VB在串口通信中的应用 温晓军 (3)、单片机原理及应用
34、 姜志海 电子工业出版社 (4)、ATMEL89系列单片机的原理与开发实践 欧阳文 中国电力出版社 (5)、RS485上下位机多机通信网络系统设计 吴桂林 郑建勇 (6)、基于RS485主从通信协议的实现 周红岭 (7)、基于RS485总线技术的PC机与单片机多机通讯设计 田拥军附录资料:不需要的可以自行删除VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。关于HOOKS 使用HOOK 将会降低
35、系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的
36、HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam) as long 加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetW
37、indowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 注释对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 注释 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类H
38、OOK的应用程序产生冲突。HOOK类型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改
39、变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。 WH_DEBUG HOOK 系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。 WH_FOREGROUNDIDLE Hook 系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使应用程序可
40、以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标
41、、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 WH_MOUSE Hook W
42、H_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。 WH_MSGFILTER and WH_SYSMSGFILTER Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。 WH_SHEL
43、L Hook 一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 使用HOOK 安装、销毁HOOK过程 监视系统事件安装、销毁HOOK过程 使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA _ (ByVal idHook
44、As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As LongidHook代表是何种Hook,有以下几种 Public Const WH_CALLWNDPROC = 4 Public Const WH_CALLWNDPROCRET = 12 Public Const WH_CBT = 5 Public Const WH_DEBUG = 9 Public Const WH_FOREGROUNDIDLE = 11 Public Const WH_GETMESSAGE = 3 Publi
45、c Const WH_HARDWARE = 8 Public Const WH_JOURNALPLAYBACK = 1 Public Const WH_JOURNALRECORD = 0 Public Const WH_KEYBOARD = 2 Public Const WH_MOUSE = 7 Public Const WH_MSGFILTER = (-1) Public Const WH_SHELL = 10 Public Const WH_SYSMSGFILTER = 6lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个H
46、ook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式 Private Function HookFunc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long ) As Long nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。 wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。 因这个叁数是一个 Function的Address所以我们固定将Hook Func
47、tion放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunchmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(.dll名称)来传入。dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。值回值 如果SetWin
48、dowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做keyboard Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B
49、中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。Declare Function CallNextHookEx Lib user32 Alias CallNextHookEx _ (ByVal hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ lParam As Any) As LonghHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。最後是将这Hook去除掉,请呼叫UnHookWindowHoo
50、kEx()Declare Function UnhookWindowsHookEx Lib user32 Alias UnhookWindowsHookEx _ (ByVal hHook As Long) As LonghHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。KeyBoard Hook的范例Hook Function的三个叁数nCode wParam lParam 传回值HC_ACTION表按键Virtual Key与WM_KEYDOWN同若讯息要被处理传0或 反之传1HC_NOREMOVEPublic hHoo
51、k as LongPublic Sub UnHookKBD ()If hnexthookproc 0 Then UnhookWindowsHookEx hHook hHook = 0End IfEnd SubPublic Function EnableKBDHook()If hHook 0 Then Exit FunctionEnd Ifhhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _ MyKBHFunc, App.hInstance, App.ThreadId)End FunctionPublic Function MyKBHFunc(ByV
52、al iCode As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long MyKBHfunc = 0 表示要处理这个讯息 If wParam = vbKeySnapshot Then 侦测 有没有按到PrintScreen键 MyKBHFunc = 1 在这个Hook便吃掉这个讯息 End If Call CallNextHookEx(hHook, iCode, wParam, lParam) 传给下一个HookEnd Function鼠标钩子的示例列下。(1)模块中输入:Public Const WM_MOUSEMOVE
53、= &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM
54、_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20A 以上是鼠标的各个值Private Declare Function CallNextHookEx Lib user32 (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any)
55、As LongPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long If nCode 0 Then HookProc = CallNextHookEx(hHook, nCode, wParam, lparam) Exit Function End If If wParam = WM_RBUTTONDOWN Then MsgBox aa End IfEnd Function(2)窗体中输入:Private Declare Function SetWindo
56、wsHookEx Lib user32 Alias SetWindowsHookExA (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPrivate Declare Function UnhookWindowsHookEx Lib user32 (ByVal hHook As Long) As LongPrivate Const WH_MOUSE_LL As Long = 14Private Sub Form_Load() hHook = SetWindowsHookEx(WH_MOUSE_LL, Addres
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村医疗健康活动设计合同
- 铁路旅客运输服务授课张芬香课件
- 双语客运值班员旅客乘车的条件课件
- 体能训练立定跳远课件
- 铁道概论桥隧之最94课件
- 中国主题课件
- 机场跑道施工合同
- 企业专职安全生产员合同范本
- 平顶山学院《中国审美文化解读与欣赏》2023-2024学年第一学期期末试卷
- 长春早期教育职业学院《时间序列分析及应用》2023-2024学年第一学期期末试卷
- 广东省2024-2025学年佛山市普通高中教学质量检测物理试卷及答案(二)高三试卷(佛山二模)
- 防水工程施工方案屋面防水施工的施工工艺
- 【9数一模】2025年安徽合肥市第四十五中学九年级中考一模数学试卷(含答案)
- 国家民政部所属单位招聘笔试真题2024
- 2024年安徽马鞍山技师学院专任教师招聘真题
- 2025年济源职业技术学院高职单招语文2019-2024历年真题考点试卷含答案解析
- 专题03 古今中外科技成就(测试)(解析版)
- 2025天津市安全员《B证》考试题库及答案
- 设计服务费用合同(2025年版)
- 广数980TDA详细说明书
- 2025年安徽国际商务职业学院单招职业适应性测试题库完整版
评论
0/150
提交评论