ImageVerifierCode 换一换
格式:DOC , 页数:34 ,大小:339.76KB ,
资源ID:4246644      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4246644.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(用VB编写基于TCP协议聊天程序.doc)为本站上传会员【可****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

用VB编写基于TCP协议聊天程序.doc

1、基于TCP协议的点对点聊天程序 计算机网络原理实验报告 基于TCP协议的点对点聊天程序 作者: 班级: 学号: 导师: 目录 1、 设计目标…………………

2、………………………………………………………3 2、 Visual Basic Winsock控件简单介绍…………………………………………………3 3、 Visual Basic Winsock控件的导入………………………………………………… …3 4、 程序设计的主要步骤………………………………………………………………….....5 4.1网络通信协议的基础和选择………………………………………………… …………5 4.2 客户端与服务器的实现过程……………………………………………….……………6 4.3 程序的编写……………………………………………………………………………….8

3、 4.4可执行文件的生成…………………………………………………………….……….14 5、测试………………………………………………………………………………………..15 6、总结………………………………………………………………………………………….18 6.1 关键问题………………………………………………………………………………….18 6.2 本程序的不足…………………………………………………………………………….18 6.3 心得体会………………………………………………………………………………….18

4、 1、 设计目标 本实验的目标是用Visual Basic语言设计一个基于TCP/IP协议的点对点的聊天程序。 利用Visual Basic Winsock控件实现。程序写完后最终生成服务器和客户端两个可执行文件,打开服务器可执行文件,即运行服务器,然后客户端可以不局域网上不同的主机上运行,输入服务器主机的IP,连接到服务器,客户端与客户端之间即可实现简易的聊天功能,在服务器可以显示在线人数以及客户端的IP地址。 2、 Visual Basic Winsock控件简单介绍 本实验用到Visual Basic中一个比较新的控件,就是Winsock

5、控件。它主要用于将Winsock接口简化成易于使用的Visual Basic内部接口。在这种控件问世之前,要想通过Visual Basic 进行网络程序设计,唯一的办法便是将所有Winsock函数都从DLL中导入(Import),然后重新定义必要的结构。但是这样的话,结构的数量就是很多,工作量也太大,且极易出错。Winsock控件问世之前,用Visual Basic进行网络编程就变得非常方便了。Winsock控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属

6、性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。 3、Visual Basic Winsock控件的导入 在打开Visual Basic 软件时,在工具箱中并没有Winsock 控件,要使用它,首先要将这个控件引用进来,如下图操件:(注意可能在部件中没有该控件,解决办法请阅读“使用必读.txt”) 点击“工程”—部件, 弹出对话框,选择Microsoft Winsock Control 6.0 。(注意可能在部件中没有该控件供选择,解决办法请阅读“使用必读.txt”) 选择完成后这时在Visual Basic的编辑画面左这的工具箱中会多一个控件

7、这就是Winsock控件,现在就可以开始使用它进行设计编程。 4、 程序设计的主要步骤 4.1网络通信协议的基础和选择   a、TCP(数据传输协议)基础   数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。   如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。   如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生

8、 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。   建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。   b、 UDP(用户数据文报协议)基础   用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。另外 UDP 应用程序可以是客户机,也可以是服务器。   为了传输数据,首先要设置客户计算机的 Loc

9、alPort 属性。然后,服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使用 DataArrival 事件内的 GetData 方法来获取已发送的信息。   c、 选择通讯协议   在使用 WinSock 控件时,首先需要选择使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:   TCP 协议是有连接的协议,可以将它同电话系统相比。在开始数据传输之前,用

10、户必须先建立连接。   UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。    通讯协议的选择是通过设置WinSock的Protocol属性来实现的。在这里我选择的是使用TCP通讯协议编写聊天程序,通过编写程序: Winsock1(0).Protocol = sckTCPProtocol,即可以选择TCP协议。也可以通过属性窗口进行选择,如下图 4.2 客户端与服务器的实现过程 客户端: a、设置远程服务器主机端口 Winsock1.Remot

11、ePort = 1600 b、设置远程服务器主机IP地址 Winsock1.RemoteHost = Trim(Text4.Text) 在文本框Text4中输入服务器的IP地址。 c、与服务器主机连接,发生错误则关闭 Winsock1.Connect d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1.SendData Text1.Text ‘要发送的话在文本框Text1中输入 Winsock

12、1.GetData c, vbString ‘接收数据,将接收到的数据存放在变量c中 Yes No Yes No e、关闭连接 Winsock1.Close SendData GetData 开始 其流程图如右所示: 断开连接? 远程主机IP与端口设置 ` Close Connect 结束 Error? 服务器端: a、设置服务器本地端口 Winsock1(0).LocalPort = 1600 b、监听客户端的连接请求

13、Winsock1(0).Listen c、当有连接到达时,接受请求 在事件Winsock1_ConnectionRequest(中编写如下代码, Winsock1(Socknumber).Accept requested d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1(Index).GetData c, vbString ‘获取数据 Winsock1(i).SendData c ‘发送数据

14、 e、关闭连接 Winsock1.Close 其流程图如下所示: 开始 本地端口设置 Listen Error ? Yes No GetData , SendData 没有断开则继续 Close Close 结束 4.3 程序的编写 客户端的程序编写:   1. 在客户端创建一个新的工程将其命名为“客户”。   2. 将缺省窗体命名为 “客户”。   3. 将窗体的标题改为“客户端。   4. 在窗体中添加一个 WinSock

15、控件,默认其命名为 Winsock1。   5. 在窗体中添加四个TextBox 控件。默认其命名为Text1、Text2、Text3、Text4,并将其内容清空。   6. 在窗体中添加四个CommandButton控件。其命名默认为 Command1、Command2、Command3、Command4,并将它们的Caption属性分别修改为“连接”、“发送”、“断开”、“清空聊天记录”。   7. 在窗体上放四个Label 控件,其命名默认为Label1、Label2、Label3、Label4,并将它们的Caption属性修改为“发送”、“聊天记录”、“系统消息”、“服务器IP”

16、   8. 在窗体上放一个StatusBar控件,其命名默认为StatusBar1其属性设置如下图所示:   9.打开菜单编辑器,为窗体添加菜单,设置如下图所示: 10. 在窗体中添加如下的代码。   Option Explicit Private Sub Command1_Click() '连接服务器程序段 Winsock1.RemoteHost = Trim(Text4.Text) Winsock1.Connect Command1.Enabled = False Do DoEvents

17、Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError If Winsock1.State = sckError Then Command1.Enabled = True Winsock1.Close Text3.Text = Text3.Text + "与服务器连接失败" + Chr$(13) + Chr$(10) Else Text3.Text = Text3.Text + "与服务器连接成功" + Chr$(13) + Chr$(10

18、) Command2.Enabled = True Command3.Enabled = True Text4.Enabled = False Text1.SetFocus StatusBar1.Panels(1).Text = " Connected to " & Winsock1.RemoteHost & " " End If End Sub Private Sub Command2_Click() '发送消息程序段 If Text1.Text = "" Then MsgBox "不能发送空

19、消息" Else Winsock1.SendData Text1.Text Text2.Text = Text2.Text + "我说的话: " + Text1.Text + Chr$(13) + Chr$(10) Text1.Text = "" End If Text1.SetFocus End Sub Private Sub Command3_Click() '断开与服务器连接程序段 Winsock1.Close Command1.Enabled = True Command2.Enabled = Fals

20、e Command3.Enabled = False Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text Text4.Enabled = True StatusBar1.Panels(1).Text = " No connection... " End Sub Private Sub Command4_Click() '清空聊天记录程序段 Text2.Text = " " Text1.SetFocus End Sub Private Sub exitbutton_Click

21、) '点击File-exit,退出聊天 End End Sub Private Sub Form_Load() '运行时最初显示的属性以及提示 ' Winsock1.RemoteHost = "218.192.165.192" Show MsgBox "Visual Basic Winsock Chat" & vbCrLf & "by chendf" & vbCrLf & vbCrLf & "Press Button'确定' , then Press Menu 'Help' for help.", vbInformation Winsock

22、1.RemotePort = 1600 Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False End Sub Private Sub helpbutton_Click() '点击Help,弹出帮助文本 ChDir App.Path Shell "notepad.exe 使用必读.txt", vbNormalFocus '调用外部程序notepad.exe来打开帮助文本文件 End Sub Private Sub Winsock1_Close() '

23、关闭winsock Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Winsock1.Close Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '数据到达 Dim c As String Winsock1.GetData c, vb

24、String Text2.Text = Text2.Text + "对方说的话: " + c + Chr$(13) + Chr$(10) End Sub   服务器端的程序编写:   1. 在服务器端创建一个新的工程将其命名为“服务器”。   2. 将缺省窗体命名为“服务器”。   3. 在窗体中添加一个ListBox控件,将其命名为“ListBox”。   4. 在窗体中添加一个WinSock控件,其名默认为Winsock1,并将其属性“Index”属性设置为0,如下图: 设置完以后,Winsock1会变成Winsock1(0

25、)。 5.在窗体上添加一个TextBox控件,其名默认为Text3,将其初值设置为0。 6. 在窗体上添加两个Label控件,其名默认为Label1、Label2,并将它们的Caption属性改为“在线人数”、“客户端IP列表”。 7.打开菜单编辑器,为窗体添加菜单file。   8. 在窗体中添加如下代码.。   Private Gac() As Boolean Dim Socknumber As Integer '定义变量 Private Sub exitbutton_Click() '点击file-exit,退出系统 End End Sub Private S

26、ub Form_Load() '开始运行时显示窗口的属性以及执行的操作 Winsock1(0).LocalPort = 1600 Winsock1(0).Protocol = sckTCPProtocol Me.Caption = "服务器" & "-" & Winsock1(0).LocalIP & ":" & Winsock1(0).LocalPort Winsock1(0).Listen Socknumber = 0 End Sub Private Sub Form_Unload(Cancel As Integer) 'unload时关

27、闭winsock Winsock1(0).Close End Sub Private Sub Winsock1_Close(Index As Integer) '关闭winsock Winsock1(Index).Close Unload Winsock1(Index) Gac(Index) = False Text3.Text = Int(Text3.Text) - 1 End Sub Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As

28、 Long) Dim ip As String Socknumber = Socknumber + 1 '连接请求 Load Winsock1(Socknumber) Winsock1(Socknumber).Accept requestID ReDim Preserve Gac(Socknumber) Gac(Socknumber) = True Text3.Text = Int(Text3.Text) + 1 ip = Winsock1(Index).RemoteHostIP L

29、istIp.AddItem ip End Sub Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim c As String '数据到达 Winsock1(Index).GetData c, vbString Dim i As Integer For i = 1 To UBound(Gac) If Not i = Index Then

30、 If Gac(i) Then Winsock1(i).SendData c DoEvents End If End If Next i End Sub 4.4可执行文件的生成 点击“文件”—“生成服务器.exe”即可生成服务器端的可执行文件, 如下图所示: (客户.exe的生成方法相同) 5、 测试 双击“服务器.exe”,运行服务器 双击“客户.exe”,运行客户端,在服务器IP中输入服务器IP地址218.192.165.192,连接,在系统消息文本框中会显示出是否连接成功

31、 如果连接成功,则在服务器中会显示客户端的IP地址,并且在线人数增加1 成功后,可以开始聊天,在客户端发送文本框中输入需要发送的消息,并点击发送按钮,将消息发送出去 经过多次测试,这个软件可以正常稳定地运行。 6、总结 6.1 关键问题 本程序的关键点在于,要对整个TCP/IP通信过程有深入了解,要熟悉Microsoft Visual Basic中Winsock控件及其编程,熟悉基于消息的异步套接字,熟悉VB各个控件的操作包括相关的事件、方法以及属性等。 6.2 本程序的不足 在本程序中,服务端的设计得比较简单,有些功能没有加进去,例如允许/禁止某

32、些用户、对用户发送消息等,客户端也有一些不足,在今后我会花时间好好学习一下,尽量将它们改进。 6.3 心得体会 Visual Basic我接触得比较早,但是利用其Winsock控件进行网络编程还是第一次。而对于TCP/IP通信协议,以前因为学校没有开设计算机网络这门课,自己也没有花时间去学习它,所以说也是第一次学习。我编写的这个程序虽然比较简单,但是它包括了整个TCP/IP的通信流程,通过完成它,对我帮助很大,加深了我对TCP/IP协议的理解,而且我开始喜欢它了,受益匪浅!附录资料:不需要的可以自行删除 VB HOOK(钩子)超级无敌详细用法(介绍) hook是WINDOWS提供的一种

33、消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。 关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。 HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种

34、类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息) HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam)

35、as long ‘加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 [注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系

36、统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 [注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。 HOOK类型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWN

37、DPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。 WH_DEBUG HOOK 系统在调

38、用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。 WH_FOREGROUNDIDLE Hook 系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook使应用

39、程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook ` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它

40、告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 WH_MOUSE Hook WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。 WH_MSGFILTER and WH_SYSMSGF

41、ILTER Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。 WH_SHELL Hook 一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 使用HOOK

42、 安装、销毁HOOK过程 监视系统事件 安装、销毁HOOK过程 使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。 Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _              (ByVal idHook As Long, _                ByVal lpfn As Long,         _             

43、   ByVal hmod As Long,         _                ByVal dwThreadId As Long) As Long idHook代表是何种Hook,有以下几种            Public Const WH_CALLWNDPROC = 4            Public Const WH_CALLWNDPROCRET = 12            Public Const WH_CBT = 5            Public Const WH_DEBUG = 9            Public Const WH_

44、FOREGROUNDIDLE = 11            Public Const WH_GETMESSAGE = 3            Public 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 Cons

45、t WH_MSGFILTER = (-1)            Public Const WH_SHELL = 10            Public Const WH_SYSMSGFILTER = 6 lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式            Private Function HookFunc(ByVal nCode As Long, _   

46、                                 ByVal wParam As Long, _                                    ByVal lParam As Long ) As Long                nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。                wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。            因这个叁数是一个 Function的Address所以我们固定将Hook Function放在

47、Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunc hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。 dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。 值回值 如果SetW

48、indowsHookEx()成功,它会传回一个值,代表目前的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的一个连线

49、如果B中不想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 Long hHook值是SetWindowsHookEx()的传回值

50、nCode, wParam, lParam则是Hook Procedure中的三个叁数。 最後是将这Hook去除掉,请呼叫UnHookWindowHookEx() Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx"         _                (ByVal hHook As Long) As Long hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。 KeyBoard Hook的范

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服