倪志慧 沈嵐嵐(桂林電子科技大學信息科技學院,廣西 桂林 541000)
隨著計算機技術的普及,在使用計算機的時候經常會面臨反復同樣的操作或者需要快速點擊的問題,如軟件測試人員在進行軟件測試的時候,和各種游戲世界里的人物操作,因此,催生了許多種的鼠標鍵盤錄制回放軟件。
然而當使用這些軟件的時候,往往會有很多不盡如人意或者不滿足自己所需求的地方,大部分軟件只是錄制點擊,沒有錄制鼠標移動的軌跡,所以本文對鼠標鍵盤的錄制和回放的原理和相關技術進行了研究。
Windows消息機制維護消息隊列來進行的,所有產生的消息都被放入消息隊列中,而消息對應著事件,每當鼠標發生移動、按鍵按下松開以及單擊雙擊類似事件的時候,都會產生相應的消息,這就使監聽鼠標鍵盤事件成為了可能。
HOOK技術能夠截獲消息并對截獲的消息參數進行處理,通過系統調用,將HOOK掛入系統。每當特定的消息發出時,在沒有到達目的窗口前,HOOK程序先截獲該消息,優先得到對該消息的控制權,并可以對消息進行各種各樣的處理,完成處理后,再繼續傳遞該消息或者直接將該消息拋棄。
本文使用Java語言,利用JNA包 (Java Native Access)來實現鼠標鍵盤監聽和回放工作。JNA提供一組Java工具類用于在運行期動態訪問系統本地庫,只要在一個Java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。鼠標鍵盤的每一個動作都會有一個消息傳遞給操作系統的應用程序,通過調用的JNA提供的公用Jar包中的接口獲取到鼠標鍵盤動作所產生的HOOK消息;將記錄的消息以一定的數據格式保存為腳本文件后,利用腳本文件怎樣去實現鼠標鍵盤動作的回放。
鼠標鍵盤錄制回放系統的實現中,需要利用Jna包來實現,所以首先需要導入JNA包,定義鼠標鍵盤鉤子以及鼠標鍵盤鉤子數據結構體:

通過調用的JNA提供的接口,在監聽HOOK消息程序中加入自定義的代碼,完成對鼠標鍵盤消息的監聽和錄制,其實現如下:


監聽截取消息的時候,得到的是消息參數,需要解析該消息參數,進一步得到需要的數據信息。對于鼠標事件,需要記錄的是鼠標的位置:和按下的按鍵,根據消息記錄下相應的操作和坐標到txt文件。而鍵盤只要記錄按下的鍵即可。
完成了鼠標和鍵盤記錄后,使用robot機器人讀取記錄鼠標操作的TXT文件,將其讀到Vector v容器中,相當于一個數組,然后分析內容結構,得知要進行的操作。
根據分析所得的內容,用robot模擬執行,實現回放,下面代碼能夠模擬執行鼠標左鍵單擊和鍵盤按鍵的操作。

本文實現了一個鼠標鍵盤的錄制與回訪系統,效果如圖1所示。

圖1 系統主界面
點擊開始錄制之后,只需要把需要重復的操作,操作一遍,程序便會記錄下來,選擇導出文件即可,當需要執行重復動作時,選擇需要加載的操作文件,點擊開始執行,便可以解放雙手人程序來完成操作。開始執行前也可以打開文件根據格式修改操作。如圖2所示:

圖2 信息記錄文件
本文基于Windows消息機制,利用HOOK技術研究基于JNA實現了一個鼠標鍵盤錄制和回放程序,能夠實現記錄操作和回放操作。但是鼠標鍵盤操作執行速度還有所不足,另外在操作回放時,不能使用電腦,不能把需要回放操作的程序后臺進行,這是需要改進的地方,有待進一步完善。