【正文】
當消息到達后,在目標窗口處理函數(shù)之前處理他。鉤子機制允許應(yīng)用程序截獲處理 Windows 消息或特定事件。鉤子實際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當特定的消息發(fā)出,在沒有達到目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這樣鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強制結(jié)束消息的傳遞。 鍵盤鉤子的工作原理:通過調(diào)用有關(guān)的 Windows API 函數(shù)來獲取鍵盤輸入的運 作,然后根據(jù)虛擬鍵表判斷按鍵的類型,最后把的到的準確的按鍵類型輸出。 當鉤子獲取到按鍵事件的時候,就判斷下是不是按下的需要的鍵值,如果是的,就給下位機發(fā)送對應(yīng)的數(shù)據(jù),其優(yōu)點是比較穩(wěn)定,不會和其他軟件發(fā)生沖突,即使在程序未激活的狀態(tài)也可以獲取按鍵的信息。 上位機軟件的設(shè)計 上位機界面的設(shè)計 VB上位機界面如圖 所示: 南京工程學院畢業(yè)設(shè)計說明書(論文) 37 圖 藍牙無線遙控小車上位機界面 上位機 程序源代碼 39。全局鉤子的模塊化代碼部分見上位機工程文件部分 。 Public Class frmHook Dim WithEvents MyKeyBoardHook As Private Sub frmHook_FormClosing(ByVal sender As Object, ByVal e As ) Handles 39。Call btnStop_Click(Nothing, Nothing) xiezaihook() End Sub Private Sub frmHook_Load(ByVal sender As Object, ByVal e As ) Handles Dim a(0) As String 39。端口號數(shù)組 Dim b As Integer 39。數(shù)組下標 39。fasongshu = 87 a = 39。獲取已有的端 口 b = UBound(a) 39。獲取數(shù)組下標 39。初始化 = 0 = 5 = 0 = 2 = 0 39。初始化 39。MsgBox(b) If b 0 Then MsgBox(沒有 找 到端口 , , 警告 ) Else 39。MsgBox(b) For i As Integer = 0 To b 39。自動添加沒有默認的端口號 ? If JieDuanKouShu(a(i)) 6 Then 39。MsgBox(a(i)) (a(i)) End If Next 39。循環(huán) 161。結(jié)束 Dim instance As UnauthorizedAccessException 39。定義串口資源占用異常 For i As Integer = 0 To b 39。自動打開端口 南京工程學院畢業(yè)設(shè)計說明書(論文) 38 Try If = True Then Exit For Else = a(i) () If = True Then = JieDuanKouShu(a(i)) 1 = 端口已打開 = = 關(guān)閉端口 End If go: End If Catch instance GoTo go End Try Next 39。循環(huán)結(jié)束 End If () 39。開始運行程序時 , 讓發(fā)送被選擇激活控件 End Sub Private Sub MyKeyboardHook_KeyDown(ByVal sender As Object, ByVal e As ) Handles fasong() End Sub Private Function JieDuanKouShu(ByVal a As String) 39。獲取端口數(shù)的號碼, 如 COM1返回 1 Dim i As String i = Mid(a, 4, 1) JieDuanKouShu = Val(i) End Function Private Sub fasong(ByVal fasongshu As Integer) 39。發(fā)送函 數(shù) If = True Then (Chr(fasongshu)) End If End Sub Private Sub Button1_Click(ByVal sender As , ByVal e As 南京工程學院畢業(yè)設(shè)計說明書(論文) 39 ) Handles If = 按鍵監(jiān)聽 Then anzhuanghook() = 關(guān)閉監(jiān)聽 Else = 按鍵監(jiān)聽 xiezaihook() End If End Sub Private Sub Botelv_SelectedIndexChanged(ByVal sender As , ByVal e As ) Handles 39。波特率選 擇 = 39。設(shè)置波特率 End Sub Private Sub Jiaoyanwei_SelectedIndexChanged(ByVal sender As , ByVal e As ) Handles 39。校驗位選擇 If = EVEN Then = 39。設(shè)置奇偶校驗 ElseIf = NONE Then = ElseIf = 0DD Then = End If End Sub Private Sub Shujuwei_SelectedIndexChanged(ByVal sender As , ByVal e As ) Handles 39。數(shù)據(jù)位選擇 = 39。設(shè)置數(shù)據(jù)位 End Sub Private Sub Tingzhiwei_SelectedIndexChanged(ByVal sender As , ByVal e As ) Handles 39。停止位選擇 = + 1 39。設(shè)置停止位 End Sub Private Sub Button8_Click(ByVal sender As , ByVal e As ) Handles 39。關(guān)閉串口 南京工程學院畢業(yè)設(shè)計說明書(論文) 40 On Error GoTo go If = 關(guān)閉端口 Then () = 端口未打開 = = 打開端口 Else () go: If = True Then 39。判斷端口是不是打開 = 端口已打開 = = 關(guān)閉端口 Else = 端口未打開 = = 打開端口 MsgBox(端 口不存在或被占用! , 0, 提示 ) End If End If End Sub Private Sub Duankou_SelectedIndexChanged(ByVal sender As , ByVal e As ) Handles 39。端口選擇 On Error GoTo Go If = True Then 39。判斷端口是不是打開 () End If = 39。設(shè)置端口號 () If = True Then 39。判斷端口是不是打開 = 端口已打開 = = 關(guān)閉端口 End If Exit Sub Go: = 端口未打開 = = 打開端口 南京工程學院畢業(yè)設(shè)計說明書(論文) 41 End Sub Private Sub anzhuanghook() 39。安裝鉤子 Try MyKeyBoardHook = New (False) Catch ex As Exception MsgBox(, , Error) End Try 39。安裝鉤子 End Sub Private Sub xiezaihook() 39。卸載 鉤子 Try If MyKeyBoardHook IsNot Nothing Then () Catch ex As Exception MsgBox(, , Error) End Try 39。卸載鉤子 End Sub End Class 本章小結(jié) 本章主要介紹了上位機設(shè) 計目標要求以及其程序流程圖和鍵盤鉤子的應(yīng)用,并說明了上位機的程序代碼。 通過對 VB 上位機的設(shè)計,使我再一次學習了 VB 的可視化界面編程,學會了上位機的設(shè)計,在整個調(diào)試的過程中,由于缺乏實際經(jīng)驗,對我來說是一個很大的挑戰(zhàn),遇到了不少的問題,但是經(jīng)過反復(fù)的調(diào)試之后,我們還是調(diào)試成功了。 在上位機的軟件編寫過程中,采用了一個全新的知識點,鉤子函數(shù)同時采用了模塊化的編程,封裝了鉤子函數(shù),更具實際工程的特點。 南京工程學院畢業(yè)設(shè)計說明書(論文) 42 第 五 章 軟件設(shè)計 巡黑線功能軟件的設(shè)計 智能小車 巡黑線利用的是黑色物體吸收紅外光的原理,當 智能小車巡黑線時,若小車方向向左偏移時,右傳感器發(fā)出的紅外光被黑線吸收,傳感器給單片機高電平信號,而左傳感器發(fā)出的紅外光依然被地面反射回來,傳感器給單片機低電平信號,單片機根據(jù)這種信號組合,控制小車右轉(zhuǎn);若小車方向向右偏移時,左傳感器發(fā)出的紅外光被黑線吸收,傳感器給單片機高電平信號,而右傳感器發(fā)出的紅外光依然被地面反射回來,傳感器給單片機低電平信號,單片機根據(jù)這種信號組合,控制小車左轉(zhuǎn);當小車直行時,此時左右傳感器都給單片機低電平,此時單片機控制小車直行。 其程序流程圖如 所示: 圖 巡黑線軟件流程圖 南京