📄 206.htm
字号:
<p>用VB编写网络监控软件</p>
<p></p>
<p></p>
<p>{ 随着互联网迅速的膨胀发展,学校、企业、网吧大部分都通过局域网连上了Internet,但是由于人员多、上网机器分散,给上网管理带来了种种不便。为此,笔者编写了一个小程序,在局域网内的每个工作站运行此程序,可以对每个工作站访问的网址进行记录。在网吧中,可以为网络犯罪提供可靠的依据;在学校里,我们可以及时地限制同学们访问非法站点和有不健康内容的网站。程序用VB6.0编写,下面是程序实现的步骤。该程序在Windows 98和IE5.5下调试通过。</p>
<p> 一、程序核心</p>
<p> 本程序的核心是通过API函数获得窗口句柄并获得浏览器访问的网址,在此基础上可以实现用Winsock控件进行远程的监视和管理。</p>
<p> 1.先创建一个工程并在窗口Form1中,并声明下面的四个API函数和两个常量:</p>
<p> Option Explicit Private Declare Function FindWindow Lib ″user32″ Alias ″FindWindowA″ (ByVal lpCl assName As String, ByVal lpWindowName As String) As Long</p>
<p> ′Findwindow函数的功能是找到当前运行的IE窗口的url地址的句柄</p>
<p> Private Declare Function SendMessage Lib ″user32″ Alias ″SendMessageA″ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long</p>
<p> ′SendMessage函数的功能是向操作系统发送一条消息</p>
<p> Private Declare Function FindWindowEx Lib ″user32″ Alias ″FindWindowExA″ (ByVal hWnd1 As Long,ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long</p>
<p> ′FindwindowEx函数的功能是找到子窗体的句柄</p>
<p> Private Declare Function SendMessageByString Lib ″user32″ Alias ″SendMessageA″ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long</p>
<p> Private Const WM_GETTEXT = &HD</p>
<p> Private Const WM_GETTEXTLENGTH = &HE</p>
<p> 2.在窗体上添加Command控件,并命名为GetURLstring,单击此命令按钮,并为其添加下面的程序代码:</p>
<p> Private Sub GetURLstring_Click()</p>
<p> On Error GoTo CallErrorA</p>
<p> Dim sClassName As String ′设定一个字符串变量,是类变量</p>
<p> Dim lhwnd As Long ′设定一个长整形变量用来接收函数返回值</p>
<p> Dim WindowHandle As Long ′设定一个长整形变量用来接收函数的返回句柄</p>
<p> lhwnd = 0</p>
<p> sClassName = (″IEFrame″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得URL地址栏的句柄,获得IE窗口的句柄</p>
<p> sClassName = (″WorkerA″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得IE窗口的工作区的句柄</p>
<p> sClassName = (″ReBarWindow32″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得IE窗口的菜单栏的句柄</p>
<p> sClassName = (″ComboBoxEx32″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得IE窗口的下拉菜单的句柄</p>
<p> sClassName = (″ComboBox″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得IE窗口的下拉菜单当前项的句柄</p>
<p> sClassName = (″Edit″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′获得这个下拉菜单的编辑框句柄</p>
<p> WindowHandle = lhwnd ′接收当前我们想要的句柄</p>
<p> Dim buffer As String ′设定字符串变量接收当前的字符串</p>
<p> Dim TextLength As Long ′设定长整形变量接收字符串的长度</p>
<p> TextLength = SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0&, 0&) ′向系统发送获得IE窗口的地址栏中的字符串长度命令</p>
<p> buffer = String(TextLength, 0) ′</p>
<p> Call SendMessageByString(WindowHandle, WM_GETTEXT, TextLength + 1, buffer) ′向系统发送获得IE窗体地址栏中的字符串命令</p>
<p> If buffer = ″″ Then</p>
<p> MsgBox ″MicroSoft InternetExplorer浏览器没有运行.″, vbOKOnly</p>
<p> Else</p>
<p> MsgBox buffer ′IE运行时显示当前网址</p>
<p> End If</p>
<p> Exit Sub</p>
<p> CallErrorA:</p>
<p> MsgBox Err.Description</p>
<p> Err.Clear</p>
<p> End Sub</p>
<p> 二、添加定时保存功能</p>
<p> 我们对上面的程序稍作改动,即可实现定时把当前访问的网址保存到文件,这样就为我们进行网络监控提供了保证。</p>
<p> 1.在窗体上添加Timer控件Timer1,并将其属性Interval设置为1000,双击此控件,定义代码如下:</p>
<p> Private Sub Timer1_Timer()</p>
<p> GetURLstring_Click</p>
<p> End Sub</p>
<p> 2. 在窗体代码开始的声明部分定义变量curUrl</p>
<p> Dim curUrl As String</p>
<p> 3.用文件操作函数把Buffer变量中的字符串写进磁盘文件中,添加代码如下</p>
<p> Private Sub Form_Load()</p>
<p> Open App.Path & ″\TestFile.txt″ For Output Access Write As #1 ′打开一个文件End Sub</p>
<p> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)</p>
<p> Close #1 ′关闭开始打开的文件</p>
<p> End Sub</p>
<p> 并把GetURLstring_Click()中的如下部分</p>
<p> If buffer = ″″ Then </p>
<p> MsgBox ″MicroSoft InternetExplorer浏览器没有运行.″, vbOKOnly</p>
<p> Else</p>
<p> MsgBox buffer ′IE运行时显示当前网址</p>
<p> End If</p>
<p> 改为如下代码:</p>
<p> If buffer <> ″″ And buffer <> curUrl Then</p>
<p> Write #1, Now & vbTab & buffer</p>
<p> curUrl = buffer</p>
<p> End If</p>
<p> 三、隐蔽运行</p>
<p> 为了防止运行在客户端的程序被用户发现,可以把窗体隐藏,并调用API函数让其在Ctrl+Alt+Del的程序列表中消失,需要把自己的程序注册为服务器(Service),这可以利用RegisterService API函数将程序的进程ID进行注册来实现。在程序退出时再次使用此API函数将服务器注册取消。方法如下:</p>
<p> 1.在窗体的声明部分声明加入API函数和需要的常数:</p>
<p> Private Declare Function GetCurrentProcessId Lib ″kernel32″ () As Long</p>
<p> Private Declare Function GetCurrentProcess Lib ″kernel32″ () As Long</p>
<p> Private Declare Function RegisterServiceProcess Lib ″kernel32″ (ByVal dwProcessID As Long, _ ByVal dwType As Long) As Long</p>
<p> Private Const RSP_SIMPLE_SERVICE = 1</p>
<p> Private Const RSP_UNREGISTER_SERVICE = 0</p>
<p> 2.注册为service和释放注册的过程:</p>
<p> 在Form_Load事件的开始添加如下代码</p>
<p> Dim pid As Long</p>
<p> Dim reserv As Long</p>
<p> pid = GetCurrentProcessId() ′得到当前进程ID</p>
<p> regserv = RegisterServiceProcess(pid, RSP_SIMPLE_SERVICE) ′把本程序注册为service</p>
<p> 把Form_QueryUnload事件修改为如下代码,即在程序结束时把服务器注册取消</p>
<p> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)</p>
<p> Dim pid As Long</p>
<p> Dim reserv As Long</p>
<p> Close #1</p>
<p> pid = GetCurrentProcessId()</p>
<p> regserv = RegisterServiceProcess(pid, RSP_UNREGISTER_SERVICE)</p>
<p> End Sub</p>
<p> 如果让程序开机运行,需要先把文件编译为可执行文件放到特定目录下,并修改注册表让其开机便运行,路径是\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVerson\Run,用API函数在里面写入个字符串型的键值,并把内容修改成为你的文件名(包括路径)即可,当然,更为实用的功能是把访问的网址信息定时传送到服务器,需要用到Winsock控件和定时传输。</p>
<p> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -