?? 206.htm
字號:
<p>用VB編寫網(wǎng)絡(luò)監(jiān)控軟件</p>
<p></p>
<p></p>
<p>{ 隨著互聯(lián)網(wǎng)迅速的膨脹發(fā)展,學(xué)校、企業(yè)、網(wǎng)吧大部分都通過局域網(wǎng)連上了Internet,但是由于人員多、上網(wǎng)機(jī)器分散,給上網(wǎng)管理帶來了種種不便。為此,筆者編寫了一個小程序,在局域網(wǎng)內(nèi)的每個工作站運(yùn)行此程序,可以對每個工作站訪問的網(wǎng)址進(jìn)行記錄。在網(wǎng)吧中,可以為網(wǎng)絡(luò)犯罪提供可靠的依據(jù);在學(xué)校里,我們可以及時地限制同學(xué)們訪問非法站點(diǎn)和有不健康內(nèi)容的網(wǎng)站。程序用VB6.0編寫,下面是程序?qū)崿F(xiàn)的步驟。該程序在Windows 98和IE5.5下調(diào)試通過。</p>
<p> 一、程序核心</p>
<p> 本程序的核心是通過API函數(shù)獲得窗口句柄并獲得瀏覽器訪問的網(wǎng)址,在此基礎(chǔ)上可以實(shí)現(xiàn)用Winsock控件進(jìn)行遠(yuǎn)程的監(jiān)視和管理。</p>
<p> 1.先創(chuàng)建一個工程并在窗口Form1中,并聲明下面的四個API函數(shù)和兩個常量:</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函數(shù)的功能是找到當(dāng)前運(yùn)行的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函數(shù)的功能是向操作系統(tǒng)發(fā)送一條消息</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函數(shù)的功能是找到子窗體的句柄</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 ′設(shè)定一個字符串變量,是類變量</p>
<p> Dim lhwnd As Long ′設(shè)定一個長整形變量用來接收函數(shù)返回值</p>
<p> Dim WindowHandle As Long ′設(shè)定一個長整形變量用來接收函數(shù)的返回句柄</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窗口的工作區(qū)的句柄</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窗口的下拉菜單當(dāng)前項(xiàng)的句柄</p>
<p> sClassName = (″Edit″)</p>
<p> lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString) ′獲得這個下拉菜單的編輯框句柄</p>
<p> WindowHandle = lhwnd ′接收當(dāng)前我們想要的句柄</p>
<p> Dim buffer As String ′設(shè)定字符串變量接收當(dāng)前的字符串</p>
<p> Dim TextLength As Long ′設(shè)定長整形變量接收字符串的長度</p>
<p> TextLength = SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0&, 0&) ′向系統(tǒng)發(fā)送獲得IE窗口的地址欄中的字符串長度命令</p>
<p> buffer = String(TextLength, 0) ′</p>
<p> Call SendMessageByString(WindowHandle, WM_GETTEXT, TextLength + 1, buffer) ′向系統(tǒng)發(fā)送獲得IE窗體地址欄中的字符串命令</p>
<p> If buffer = ″″ Then</p>
<p> MsgBox ″MicroSoft InternetExplorer瀏覽器沒有運(yùn)行.″, vbOKOnly</p>
<p> Else</p>
<p> MsgBox buffer ′IE運(yùn)行時顯示當(dāng)前網(wǎng)址</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> 我們對上面的程序稍作改動,即可實(shí)現(xiàn)定時把當(dāng)前訪問的網(wǎng)址保存到文件,這樣就為我們進(jìn)行網(wǎng)絡(luò)監(jiān)控提供了保證。</p>
<p> 1.在窗體上添加Timer控件Timer1,并將其屬性Interval設(shè)置為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.用文件操作函數(shù)把Buffer變量中的字符串寫進(jìn)磁盤文件中,添加代碼如下</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 ′關(guān)閉開始打開的文件</p>
<p> End Sub</p>
<p> 并把GetURLstring_Click()中的如下部分</p>
<p> If buffer = ″″ Then </p>
<p> MsgBox ″MicroSoft InternetExplorer瀏覽器沒有運(yùn)行.″, vbOKOnly</p>
<p> Else</p>
<p> MsgBox buffer ′IE運(yùn)行時顯示當(dāng)前網(wǎng)址</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> 三、隱蔽運(yùn)行</p>
<p> 為了防止運(yùn)行在客戶端的程序被用戶發(fā)現(xiàn),可以把窗體隱藏,并調(diào)用API函數(shù)讓其在Ctrl+Alt+Del的程序列表中消失,需要把自己的程序注冊為服務(wù)器(Service),這可以利用RegisterService API函數(shù)將程序的進(jìn)程ID進(jìn)行注冊來實(shí)現(xiàn)。在程序退出時再次使用此API函數(shù)將服務(wù)器注冊取消。方法如下:</p>
<p> 1.在窗體的聲明部分聲明加入API函數(shù)和需要的常數(shù):</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() ′得到當(dāng)前進(jìn)程ID</p>
<p> regserv = RegisterServiceProcess(pid, RSP_SIMPLE_SERVICE) ′把本程序注冊為service</p>
<p> 把Form_QueryUnload事件修改為如下代碼,即在程序結(jié)束時把服務(wù)器注冊取消</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> 如果讓程序開機(jī)運(yùn)行,需要先把文件編譯為可執(zhí)行文件放到特定目錄下,并修改注冊表讓其開機(jī)便運(yùn)行,路徑是\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVerson\Run,用API函數(shù)在里面寫入個字符串型的鍵值,并把內(nèi)容修改成為你的文件名(包括路徑)即可,當(dāng)然,更為實(shí)用的功能是把訪問的網(wǎng)址信息定時傳送到服務(wù)器,需要用到Winsock控件和定時傳輸。</p>
<p> </p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -