版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 本科生畢業(yè)論文</b></p><p> 鍵盤音樂軟件的研究與開發(fā)</p><p> 2011年5月23日</p><p><b> 畢業(yè) 論文開題報告</b></p><p><b> 摘 要:</b></p><p&
2、gt; 在許多系統(tǒng)中,出于安全或其他原因,常常需要隨時對鍵盤進行監(jiān)控,利用鉤子技術編寫的應用程序能夠很好的達到這個目的。本文就制作鍵盤音樂軟件進行闡釋。在軟件運行過程中,用戶在鍵盤上的按鍵操作就會播放聲音文件。</p><p> 本系統(tǒng)開發(fā)的鍵盤音樂軟件是一種 利用鉤子技術編寫的鉤子軟件,用于隨時監(jiān)控用戶的按鍵操作。鍵盤音樂軟件主要功能是利用鉤子技術監(jiān)控系統(tǒng)的鍵盤。用戶在鍵盤上的按鍵操作就會播放相應的聲音文件
3、,不管焦點是否在本軟件中,一方面實現(xiàn)了對鍵盤的監(jiān)控,另一方面也改善了鍵盤按鍵聲音。</p><p> 關鍵詞:動態(tài)鏈接庫;鉤子;鉤子函數(shù);資源</p><p><b> Abstract</b></p><p> In many systems, we always need to monitor the keyboard for the
4、 reason of security. The hook technology can reach the aim easily. In this article, we give an explanation of how to make a keyboard sound software. It will play the wave files when user press any key of the keyboard whi
5、le it in processing.</p><p> It is a software, basing on the hook technology. Keyboard Music software can monitor the operation of the user. Whether the focus in the current process, it will play the wave f
6、iles when user press any key. The user can monitor the keyboard and change the sound of it.</p><p> Key Words: Dynamic link library;Hook;Hook Function;Resource</p><p><b> 目 錄</b>&l
7、t;/p><p> 中文摘要………………………………………………………………………Ⅰ </p><p> 英文摘要………………………………………………………………………Ⅱ</p><p> 目錄……………………………………………………………………………Ⅲ</p><p> 1前言……………………………………………………………………………1
8、</p><p> 2系統(tǒng)開發(fā)背景………………………………………………………………2</p><p> 3開發(fā)工具介紹………………………………………………………………4</p><p> 3.1開發(fā)工具及數(shù)據(jù)庫系統(tǒng)的選擇…………………………………………4</p><p> 3.1.1 ASP簡介………………………………………………
9、…………4</p><p> 3.1.2 ASP特點 ………………………………………………………4</p><p> 3.1.3 ASP的工作原理 …………………………………………… 5</p><p> 3.1.4 SQL Server軟件概述 ………………………………………5</p><p>
10、 3.2軟件運行環(huán)境設置………………………………………………………5</p><p> 4 系統(tǒng)的整體設計………………………………………………………………7</p><p> 4.1 需求分析 ………………………………………………………………7</p><p> 4.2系統(tǒng)設計思想……………………………………………………………7</p>&l
11、t;p> 4.3系統(tǒng)總體結構圖…………………………………………………………7</p><p> 4.4系統(tǒng)功能描述……………………………………………………………8</p><p> 4.5功能模塊劃分……………………………………………………………9</p><p> 4.6系統(tǒng)流程分析 …………………………………………………………10</p>
12、;<p> 4.7系統(tǒng)功能模塊圖 ………………………………………………………11</p><p> 4.8系統(tǒng)網(wǎng)絡數(shù)據(jù)庫的建立 ………………………………………………12</p><p> 4.8.1系統(tǒng)數(shù)據(jù)源的設置………………………………………………12</p><p> 4.8.2建立數(shù)據(jù)庫表……………………………………………………13&l
13、t;/p><p> 5系統(tǒng)的實現(xiàn)………………………………………………………………16</p><p> 5.1客戶端… … ……………………………………………………………16</p><p> 5.1.1 會員注冊…………………………………………………………16</p><p> 5.1.2 購物車 ……………………………………
14、……………………17</p><p> 5.1.3 商品查詢 ………………………………………………………19</p><p> 5.2后臺管理端 ……………………………………………………………21</p><p> 5.2.1 商品的添加………………………………………………………22</p><p> 5.2.2 商品的審查
15、………………………………………………………25</p><p> 5.2.3 訂單的審查………………………………………………………26</p><p> 5.2.4 會員的審查………………………………………………………27</p><p> 5.2.5 管理員添加………………………………………………………29</p><p>
16、5.2.6 管理員審查………………………………………………………30</p><p> 5主要技術難點及解決方法…………………………………………………32 </p><p> 7結束語……………………………………………………………………33</p><p> 參考文獻……………………………………………
17、………………………34</p><p> 致 謝…………………………………………………………………………35</p><p><b> 1 前 言</b></p><p> 為用戶提供已經(jīng)驗證的代碼作為程序組件,歷來是各種程序開發(fā)工具的追求。在面向過程的程序設計工具中,程序組件以函數(shù)的形式向用戶提供。一個功能強大的程序設計工具,往往附加有
18、豐富的函數(shù)庫。C語言就是這樣的一種程序開發(fā)工具。在面向?qū)ο蟮某绦蛟O計工具中,程序組件則以類的形式向用戶提供。一個功能強大的程序設計工具,往往附加有豐富的類庫。Visual C++就是這樣的一個程序開發(fā)工具,它的Microsoft基本類庫——MFC 能為用戶提供大量預先編好的類及支持代碼。這些類封裝了大量的標準Windows 編程中使用的處理函數(shù)和數(shù)據(jù),從而大大簡化了用戶的Windows編程工具。程序設計是計算機的靈魂,程序設計是計算機的
19、生命的源泉。綜觀歷史,計算機的進步基本上是沿三條主線不斷進步的:一是計算機元器件的進步,二是計算機體系結構的進步,三是程序設計,開發(fā)方法和開發(fā)工具的進步。開發(fā)方法和開發(fā)工具作為程序設計的兩個車輪,相輔相成的將程序設計不斷的帶向新的水平。</p><p> 從程序設計方法上看,程序設計已經(jīng)經(jīng)過了面向過程、面向數(shù)據(jù)、面向?qū)ο蟆⒚嫦蛸Y源幾個階段。從程序的表述上來看,程序設計經(jīng)過了如下階段:代碼編程,表格編程和圖形編程
20、。代碼編程是使用字符編碼書寫源程序,既可以書寫面向過程的程序,又可以書寫面向?qū)ο蟮某绦?。表格是使用表格或表示圖標設計程序邏輯,通過圖形編輯自動產(chǎn)生程序代碼,主要用于產(chǎn)生面向數(shù)據(jù)的程序設計。圖形編程是由于通行用戶界面(GUI)的出現(xiàn)而產(chǎn)生的程序開發(fā)平臺。 主要使用圖形單元構建應用程序。隨著GUI 技術的進一步發(fā)展和系統(tǒng)提供的構建的豐富,工具軟件包越來越多,系統(tǒng)資源的利用成為軟件開發(fā)的關鍵,面向資源的應用程序開發(fā)應運而生。這條發(fā)展線路遵循著
21、一個代碼隱藏的原則。VC++ 正是循著這樣一條軌跡展現(xiàn)出的時代產(chǎn)品。它把WINDOWS 統(tǒng)一而又漂亮的界面風格,面向?qū)ο蟮某绦蛟O計方法和面向資源的環(huán)境結合在一起,形成一個功能強大而復雜的C++編譯器。它能提供簡單而又高效的操作方式 ,高效的內(nèi)存管理與設備無關的圖形接口,數(shù)據(jù)共享和多任務的運行機制,同時又提供了一系列功能強大的開發(fā)工具和內(nèi)容豐富的開發(fā)資源。</p><p> 主要研究內(nèi)容;本課題軟件主要研究VC+
22、+中的鉤子函數(shù)及對動動態(tài)鏈接庫的使用。動態(tài)鏈接庫(DLL:Dynamic-Link Library)是Windows環(huán)境中軟件開發(fā)的重要組成部分也是分布式計算中的組件對象模型(COM)技術的基本支柱之一。使用動態(tài)鏈接庫就可以靈活的設計與實現(xiàn)各類軟件系統(tǒng)。</p><p> 鍵盤奏鳴曲軟件的開發(fā)過程,其中用到的最關鍵的技術就是鉤子技術。通過鉤子技術,不但可以截獲鍵盤的輸入,還可以截獲鼠標等的其他系統(tǒng)信息。鍵盤奏鳴
23、曲軟件的主體開發(fā)環(huán)境的選擇是Visual C++ 6.0,選擇的理由如下:(1)本軟件的技術難度很大 ,特別是鉤子(Hook)技術,應用Visual C++ 6.0可以輕松的實現(xiàn)系統(tǒng)的調(diào)用。(2)由于本軟件規(guī)模較小,所以選用基于Visual C++ 6.0的DLL技術,減少軟件所占的內(nèi)存空間,效率更高。本軟件看似簡單,實現(xiàn)鍵盤奏鳴很簡單,只要在鍵盤的KeyUp、KeyDown等事件中添加事件代碼,判斷用戶按鍵,根據(jù)鍵盤碼識別出各鍵,
24、播放不同的聲音文件即可。事情并非如此簡單。用上面的方法,當本軟件是在當前進程時,鍵盤奏鳴的功能可以實現(xiàn),但是當打開其他應用程序進行一些操作時,由于本軟件不再成為鍵盤輸入的焦點,鍵盤奏鳴的功能也就消失了。而我們需要的事鍵盤的系統(tǒng)監(jiān)控,只要本軟件在運行,無論目前計算機在做什么,都能檢測到用戶按鍵的行為并作出反應,這就要用到Hook技術。</p><p> 作為一名學生,在學習過程中發(fā)現(xiàn),在許多系統(tǒng)中,出于安全或其他
25、原因,常常需要隨時對鍵盤進行監(jiān)控,利用鉤子技術編寫的應用程序能夠很好的達到這個目的。我在這里就制作一個鍵盤音樂軟件進行闡釋。即在軟件運行過程中,用戶在鍵盤上的按鍵操作就會播放聲音文件 ,對本軟件稍加擴展就是一個完整的鍵盤監(jiān)控軟件。我使用的是目前在軟件開發(fā)領域較為熱門的軟件開發(fā)工具Visual C++。本課題的選用是基于目前軟件開發(fā)行業(yè)現(xiàn)狀結合我將來所要從事的工作,所以選用較為熱門的軟件開發(fā)工具VC++。</p><p
26、><b> 2需求分析</b></p><p> 軟件工程包含技術和管理兩方面的內(nèi)容,是管理與技術的緊密結合。目前軟件工程方法學分為傳統(tǒng)方法學和面向?qū)ο蠓椒▽W。</p><p><b> 2.1業(yè)務需求分析</b></p><p> 傳統(tǒng)的軟件工程方法學使用結構化分析技術,完成分析用戶需求工作。需求分析要了解
27、用戶的情況,接下來通過與用戶交流,對用戶的基本要求反復細化,以得出對目標系統(tǒng)的完整、準確和具體的需求。需求分析是為了發(fā)現(xiàn)用戶的真正需求,首先應從宏觀角度調(diào)查、分析用戶所面臨的問題,也就是說,需求分析的第一步是盡可能準確地了解用戶當前的情況和需要解決的問題。鍵盤音樂軟件針對以下客戶群:</p><p> ?。?)計算機或網(wǎng)絡管理人員進行計算機鍵盤的監(jiān)控。</p><p> ?。?)辦公室人員
28、可以應用本軟件調(diào)節(jié)心情,改變單調(diào)的工作節(jié)奏。</p><p> (3)有意學習和研究鉤子技術,使軟件實現(xiàn)一些特殊功能的程序員。</p><p> 鍵盤音樂軟件主要功能是利用鉤子技術監(jiān)控系統(tǒng)的鍵盤。用戶在鍵盤上的按鍵操作就會播放相應的聲音文件,而不管焦點是否在本軟件中,一方面實現(xiàn)了對鍵盤的監(jiān)控,另一方面也改善了鍵盤按鍵的單調(diào),因為可以播放不同的聲音,增加趣味性。把鍵盤監(jiān)控和休閑娛樂兩者有
29、機結合,這樣才能更好的為用戶服務。</p><p><b> 2.2系統(tǒng)特點</b></p><p> 鍵盤音樂軟件是一種利用鉤子技術編寫的鉤子軟件,用于隨時監(jiān)控用戶的按鍵操作。它有以下幾個特色。</p><p><b> 1.功能封裝 </b></p><p> 本軟件中的主要功能都是通過
30、一個DLL文件實現(xiàn)的,在其中封裝了鍵盤監(jiān)控和發(fā)音等功能。需要啟動鍵盤音樂功能時調(diào)用StartHook函數(shù),需要停止鍵盤音樂功能時調(diào)用StopHook即可。</p><p> 2.利用鉤子技術實現(xiàn)系統(tǒng)的鍵盤監(jiān)控</p><p> 只要啟動鍵盤音樂軟件后,不管輸入焦點是否在本軟件中,按鍵的過程中都會播放聲音文件。</p><p> 鍵盤音樂軟件主要功能是利用鉤子技
31、術監(jiān)控系統(tǒng)的鍵盤。用戶在鍵盤上的按鍵操作就會播放相應的聲音文件,而不管焦點是否在本軟件中,一方面實現(xiàn)了對鍵盤的監(jiān)控,另一方面也改善了鍵盤按鍵的單調(diào),因為可以播放不同的聲音,增加趣味性。</p><p><b> 3系統(tǒng)的整體設計</b></p><p> 3.1 軟件工具的選型</p><p> 鍵盤音樂軟件的主體開發(fā)環(huán)境的選擇是Vis
32、ual C++ 6.0,選擇的理由如下:</p><p> ?。?) 本軟件的技術難度很大 ,特別是鉤子(Hook)技術,應用Visual C++ 6.0可以輕松的實現(xiàn)系統(tǒng)的調(diào)用。</p><p> ?。?) 由于本軟件規(guī)模較小,所以選用基于Visual C++ 6.0的DLL技術,減少軟件所占的內(nèi)存空間,效率更高。</p><p> 因為本軟件所涉及的這兩大技術
33、,我選擇了Visual C++6.0作為主體開發(fā)環(huán)境,這樣可以更加方便快捷地開發(fā)設計本軟件。研發(fā)本軟件時我用的個人電腦裝的操作系統(tǒng)為Windows XP,內(nèi)存為256M,硬盤80G。</p><p> Visual C++ 6.0中的鉤子(Hook)技術簡介:</p><p> 鉤子技術(Hook)是一段以處理系統(tǒng)消息的程序,通過系統(tǒng)調(diào)用,將其掛入系統(tǒng)。鉤子的種類有很多,每種鉤子可以截
34、獲并處理相應的消息,每當特定的消息發(fā)出,在到達目的窗口之前,鉤子程序先行截獲該消息,得到對此消息的控制權。此時在鉤子函數(shù)中就可以對截獲的消息進行加工處理,甚至可以強制結束消息的傳遞。從鉤子的本質(zhì)來看,可以優(yōu)先截獲操作系統(tǒng)的各種消息進行處理,所以它幾乎無所不能,因為Windows的應用程序都是基于消息驅(qū)動的,應用程序的操作都依賴于他所得到的消息類型及內(nèi)容。</p><p> 如果Hook過程在應用程序中實現(xiàn),若應
35、用程序不是當前窗口時,該Hook就不起作用;如果Hook在DLL中實現(xiàn),程序在運行中動態(tài)調(diào)用它,它能實時對系統(tǒng)進行監(jiān)控。根據(jù)需要,我采用的是在DLL中實現(xiàn)Hook的方式。</p><p> Visual C++ 6.0中的動態(tài)鏈接庫(DLL)簡介:</p><p> (1)用DLL可以實現(xiàn)不同程序之間的代碼重用。普通的函數(shù)庫也可以實現(xiàn)不同應用程序之間的代碼重用:將一些通用程序的代碼使用
36、一些比較獨立的函數(shù)來實現(xiàn),這樣在不同應用程序的源代碼中進行直接調(diào)用即可。若在多個同樣的程序執(zhí)行時,則系統(tǒng)中就保留了許多重復的代碼副本,就會造成內(nèi)存資源的浪費。在這種情況下,若使用DLL,則實現(xiàn)的就是動態(tài)鏈接,并不是將庫代碼拷貝,而只是在程序中記錄了函數(shù)的入口點和接口,并只在程序執(zhí)行時才將庫代碼裝入內(nèi)存。這樣,不管有多少個程序同時使用某個DLL,內(nèi)存中都只有這個DLL 的一個副本。當沒有程序使用這個DLL時,系統(tǒng)就將其移出,從而釋放了相應
37、的內(nèi)存空間。</p><p> ?。?)DLL技術對于開發(fā)大型軟件系統(tǒng)有很多可用之處。在大型軟件系統(tǒng)中,如果所有的功能均使用一個可執(zhí)行文件來完成,則最終的可執(zhí)行文件將會非常龐大,而且其中還將有許多重復的功能。另外,龐大的可執(zhí)行文件對于軟件的開發(fā)與維護也將是一件非常困難的事情。一個比較好的方法就是使用DLL,將軟件系統(tǒng)分成一個主框架程序和一系列DLL。這樣將會大大降低軟件開發(fā)的復雜度,同時也可以減少開發(fā)的工作量。另
38、外,由于每個模塊都比較小,而且都相對獨立,在運行時也可以提高訪問的速度,增加軟件的運行效率。</p><p> ?。?)DLL可以方便的實現(xiàn)軟件的多國語言版本。使用DLL就可以方便地支持世界各國的語言。程序員將依賴于語言的函數(shù)和資源分離出來,而專門放進不同的DLL中去。比如,對于中文英文和法文,各自實現(xiàn)一個相對的DLL。在軟件用戶安裝軟件時,將提示選擇相應的語言版本來安裝。所以使用DLL是實現(xiàn)軟件商品國際化的一項
39、技術。</p><p><b> 3.2 功能分析</b></p><p> 鍵盤音樂軟件的細分功能如下:</p><p> ?。?) 定義鉤子函數(shù)。</p><p> ?。?) 在鉤子函數(shù)中實現(xiàn)所需功能,即無論軟件是否是當前進程,都能夠進行鍵盤監(jiān)控,判斷出用戶所按鍵是哪個鍵,根據(jù)用戶按鍵的不同,播放不同的文件。&
40、lt;/p><p> ?。?) 能夠根據(jù)需要啟動和停止鍵盤奏鳴功能,即安裝鉤子和卸載鉤子。</p><p> (4) 定義并使用共享數(shù)據(jù)段。</p><p> 3.3 模塊分工設計</p><p> 本軟件分成兩個模塊,一部分是DLL模塊,里面利用鉤子技術完成鍵盤監(jiān)控和播放聲音文件的功能;</p><p> 另一
41、部分是界面調(diào)用模塊,調(diào)用DLL啟動和停止鍵盤奏鳴功能。</p><p> 圖3-1 模塊分工設計圖</p><p> 如圖3-1所示,上面的一部分是DLL模塊 ,AppWizard 是用類別名稱和源程序名產(chǎn)生 Windows 應用程序的一個工作向?qū)?,通過動態(tài)鏈接庫(DLL)經(jīng)編譯生成.LIB文件,然后和界面鏈接生成.exe運行程序。</p><p> 4系統(tǒng)的
42、技術難點及解決方法</p><p><b> 4.1鉤子技術</b></p><p> 本軟件看似簡單,實現(xiàn)鍵盤奏鳴很簡單,只要在鍵盤的KeyUp、KeyDown等事件中添加事件代碼,判斷用戶按鍵,根據(jù)鍵盤碼識別出各鍵,播放不同的聲音文件即可。事情并非如此簡單。用上面的方法,當本軟件是在當前進程時,鍵盤奏鳴的功能可以實現(xiàn),但是當打開其他應用程序進行一些操作時,由于
43、本軟件不再成為鍵盤輸入的焦點,鍵盤奏鳴的功能也就消失了。而我們需要的是鍵盤的系統(tǒng)監(jiān)控,只要本軟件在運行,無論目前計算機在做什么,都能檢測到用戶按鍵的行為并作出反應,這就要用到Hook技術。</p><p> 鉤子技術在很多特殊軟件中廣泛應用,例如,金山詞霸的“取詞”功能是很奇妙的,這里就用到了鉤子技術,類似的軟件還有中文之星東方快車譯典通等等......,雖然不同的軟件的具體實現(xiàn)不同,但大致原理使相同的。<
44、;/p><p> 1.系統(tǒng)鉤子和線程鉤子</p><p> 在WINDOWS中,鉤子有兩種,一種是系統(tǒng)鉤子(RemoteHook),它對消息的監(jiān)控是整個系統(tǒng)范圍,另一種是線程鉤子(Local Hook) ,它的攔截范圍只有進程內(nèi)部的消息。</p><p> 對于系統(tǒng)鉤子,其鉤子函數(shù)(HookFuction)應在Windows系統(tǒng)的動態(tài)連接庫DLL中實現(xiàn)。</
45、p><p> 設計本系統(tǒng)時,Windows先在系統(tǒng)內(nèi)存中創(chuàng)建一個數(shù)據(jù)結構,該數(shù)據(jù)結構包含了鉤子的相關信息,然后把該結構體加到已經(jīng)存在的鉤子鏈表中去。當發(fā)生敲擊鍵盤事件時,如果安裝的是一個局部鉤子,當前進程的鉤子函數(shù)將被調(diào)用。如果是一個遠程鉤子,系統(tǒng)就必須把鉤子函數(shù)插入到其他進程的地址空間,要做到這一點就必須在一個動態(tài)鏈接庫中去。但有兩個例外,就是日志鉤子和日志回放鉤子,它是一種比較特殊的鉤子,它可以掛載到系統(tǒng)范圍內(nèi)
46、的任何進程中,而且不需要另外編寫一個DLL來映射到其他進程的內(nèi)存空間中。</p><p><b> 2.鉤子的分類</b></p><p> 安裝不同的鉤子,可以截獲監(jiān)視不同的消息類型,有針對性地對所需要的消息進行過濾和處理,鉤子主要分為以下幾類:</p><p> (1)WH_CALLWNDPROC 和 WH_CALLWNDPROCRE
47、T Hooks</p><p> WH_CALLWNDPROC 和 WH_CALLWNDPROCRET Hooks使你可以監(jiān)視發(fā)送到窗口過程的消息。使本系統(tǒng)在消息發(fā)送到接收窗口過程之前調(diào)用WH_CALLWNDPROC Hooks子程,并且在窗口過程處理完消息之后調(diào)用 WH_CALLWNDPROCRET Hooks子程。</p><p> WH_CALLWNDPROCRET Hooks傳
48、遞指針到CWPRETSTRUCT結構,再傳遞到Hook子程。 CWPRETSTRUCT結構包含了來自處理消息的窗口過程的返回值,同樣也包括了與這個消息關聯(lián)的消息參數(shù)。</p><p> (2)WH_DEBUG Hook</p><p> 在系統(tǒng)調(diào)用系統(tǒng)中與其他Hook關聯(lián)的Hook子程之前,系統(tǒng)會調(diào)用WH_DEBUG Hook子程??梢允褂眠@個Hook來決定是否允許系統(tǒng)調(diào)用與其他 Ho
49、ok關聯(lián)的Hook子程。</p><p> (3)WH_GETMESSAGE Hook</p><p> 應用程序使用WH_GETMESSAGE Hook來監(jiān)視從GetMessage or peekMessage函數(shù)返回的消息。你可以使用WH_GETESSAGE Hook去監(jiān)視鍵盤輸入,以及其他發(fā)送到消息隊列中的消息。</p><p> (4)WH_JOURN
50、ALPAYBACK Hook</p><p> WH_JOURNALPAYBACK Hook使應用程序可以插入消息到系統(tǒng)隊列??梢允褂眠@個Hook回放通過使用WH_JOURNALPAYBACK Hook記錄下來的連續(xù)的鍵盤事件。</p><p> 只要WH_JOURNALPAYBACK Hook已經(jīng)安裝,正常的鍵盤事件就是無效的。WH_JOURNALPAYBACK Hook是全局Hoo
51、k,它不能像線程特定Hook一樣使用。WH_JOURNALPAYBACK Hook返回超時值,這個值告訴系統(tǒng)在處理來自回放Hook當前消息之前需要等待多長時間(毫秒).這就使Hook可以控制實時事件的回放。WH_JOURNALPAYBACK是system-wide local hooks,他們不會被映射到任何行程位址空間(有一些練習大字的軟件是用這個Hook做的)。</p><p> (5)WH_JOURNAL
52、RECORD Hook </p><p> WH_JOURNALRECORD Hook是用來監(jiān)視和記錄輸入事件。典型的,可以使用這個Hook記錄連續(xù)的鼠標和鍵盤事件,然后通過使用WH_JOURNALRECORD Hook來回放。WH_JOURNALRECORD Hook是全局Hook,它不能像線程特定Hook一樣使用。</p><p> (6)WH_KEYBORD Hook</p
53、><p> 在應用程序中,WH_KEYBORD Hook用來監(jiān)視WM_KEYDOWN和WM_KEYUP消息,這些消息通過GETMessage or PeekMessage函數(shù)返回。可以使用這個Hook來監(jiān)視輸入到消息隊列中的鍵盤消息。</p><p> (7)WH_KEYBORD_LL Hook</p><p> WH_KEYBORD_LL Hook監(jiān)視輸入到線程
54、消息隊列中的鍵盤消息。</p><p> (8)WH_MSGFILTERWH_SYSMSGFILTER Hooks</p><p> WH_SYSMSGFILTER Hooks監(jiān)視所有應用程序消息。WH_MSGFILTER和WH_SYSMSGFILTER Hooks使我們可以在模式循環(huán)期間過濾消息,這等價于在住消息循環(huán)中過濾消息。通過調(diào)用CallMsgFilter函數(shù)可以直接調(diào)用WH_
55、MSGFILTER Hook。通過使用這個函數(shù),應用程序能夠在模式循環(huán)期間使用相同的代碼去過濾消息,如同在主消息循環(huán)里一樣。</p><p> 應用程序可以在鉤子上設置多個鉤子函數(shù),由其組成一個與鉤子相關的指向鉤子函數(shù)的指針列表(鉤子鏈表)當鉤子所監(jiān)視的消息出現(xiàn)時,Windows首先將其送到調(diào)用鏈表中所指向的第一個鉤子函數(shù)中,鉤子函數(shù)將根據(jù)其各自的功能對消息進行監(jiān)視、修改和控制,并在處理完成后把消息傳遞給下一個
56、鉤子函數(shù)直至到達鉤子鏈表的末尾。</p><p> 在鉤子函數(shù)交出控制權后,被攔截的消息最終仍將交還給窗口處理函數(shù)。雖然鉤子鉤子程序的步驟分為三步:定義鉤子函數(shù)、安裝鉤子和卸載鉤子。</p><p> 首先需要定義鉤子函數(shù)。</p><p> 鉤子函數(shù)是一種特殊的回調(diào)函數(shù)。鉤子監(jiān)視的特殊事件發(fā)生后,系統(tǒng)會調(diào)用鉤子函數(shù)函數(shù)對消息的過濾將略加影響系統(tǒng)的運行效率,但
57、在很多場合下通過鉤子對消息的過濾處理可以完成一些其他方法所不能完成的特殊功能。</p><p> 如果安裝多個鉤子,那么最近安裝的鉤子將被置于鉤子鏈的開始,最早安裝的鉤子則放在最后。在鉤子監(jiān)視的消息出現(xiàn)時,操作系統(tǒng)調(diào)用鏈表開始處的第一個鉤子函數(shù)進行處理,也就是說最后加入的鉤子最先獲得控制權。</p><p> 3. 編寫鉤子函數(shù) </p><p> 編寫進
58、行處理。不同事件的鉤子函數(shù)的形式是各不相同的。下面以鼠標鉤子函數(shù)舉例說明鉤子函數(shù)原型:</p><p> LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LARAM lParam)</p><p> 參數(shù)wParam和lParam包含所“鉤”消息的信息,比如鼠標位置、狀態(tài)、鍵盤按鍵等。</p><p> n
59、Code包含有關消息本身的信息,比如是否從消息的隊列中移出??梢韵葟你^子函數(shù)中實現(xiàn)自定義功能,然后調(diào)用函數(shù)CallNextHookEx. 把鉤子信息傳遞給鉤子鏈的下一個鉤子函數(shù)。CallNextHookEx.的原型如下:</p><p> LRESULT CallNextHookEx(HHOOK hhk,int nCode, WPARAM wParam,LPARAM lParam)</p><
60、;p><b> 參數(shù)說明如下:</b></p><p><b> hhk:鉤子句柄。</b></p><p> nCode,wParam和 lParam:鉤子函數(shù)。</p><p> 當然也可以通過TRUE來丟棄該消息,就阻止了該消息的傳遞。</p><p> 安裝鉤子使用SetWi
61、ndowsHookEx 函數(shù)。</p><p> 當不再使用鉤子時,必須及時卸載。簡單的調(diào)用UnhookWindowsHookEx函數(shù)即可。</p><p> 4. Win32 DLL</p><p> 由于本軟件所有的系統(tǒng)鉤子要DLL,所以先介紹一下Win32 DLL與本軟件有關的特點。</p><p> 無論何時當一個進程或線程載
62、入和卸載DLL時,都要調(diào)用該函數(shù),它的原型為:</p><p> BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)</p><p><b> 參數(shù)說明如下:</b></p><p> hinstDLL :表示DLL的實例句柄。</
63、p><p> fdwReason:根據(jù)該參數(shù)對DLL進行必要的初始化或者清理工作。</p><p> lpvReserved:系統(tǒng)保留。</p><p> 第二個參數(shù)有四個可能值:DLL_PROCESS_ATTACH(進程載入)DLL_THREAD_ATTACH(線程載入)DLL_THREAD_DETACH(線程卸載)DLL_PROCESS_DETACH(進程卸載
64、)在DLLMain函數(shù)中可以對傳遞進來的這個參數(shù)的值進行判別并根據(jù)不同的參數(shù)值對DLL進行必要的初始化或清理工作。舉例來說當有一個進程載入一個DLL時系統(tǒng)分配給DLL的第二個參數(shù)為DLL_PROCESS_ATTACH,這時,你可以根據(jù)這個參數(shù)初始化特定的數(shù)據(jù)。</p><p> 在Win32環(huán)境下要想在多個進程中共享數(shù)據(jù)就必須進行必要的設置。亦即把這些需要共享的數(shù)據(jù)分離出來放置在一個獨立的數(shù)據(jù)段里,并把該段的屬
65、性設置為共享。</p><p> 下面簡述VC++6.0中全局共享數(shù)據(jù)的實現(xiàn)。再主文件中,用#pragma data_seg建立一個新的數(shù)據(jù)段并定義共享數(shù)據(jù),其具體格式為:</p><p> # pragma data_seg(“shareddata”)</p><p> HWND sharedwnd=NULL;//共享數(shù)據(jù)</p><
66、p> #pragma data_seg()</p><p> 僅定義一個數(shù)據(jù)段還不能達到共享數(shù)據(jù)的目的,還要告訴編譯器該段的屬性,有兩種方法可以實現(xiàn)該目的(其效果是相同的)一種方法是在.def文件中加入如下語句:SECTIONS</p><p> Shareddata READ WRITE SHARED</p><p> 另一種方法是在項目設置
67、鏈接選項中加入如下語句:</p><p> /SECTION:shareddata.rws</p><p> 有了上面的基礎,開發(fā)鍵盤音樂軟件的關鍵技術都已經(jīng)解決,下面開始進入編碼階段。</p><p> 4.2 動態(tài)鏈接庫技術</p><p> 本軟件分成兩部分,一部分是DLL模塊,里面利用鉤子技術完成鍵盤監(jiān)控和播放聲音文件的功能
68、;另一部分是界面部分,調(diào)用DLL和停止鍵盤奏鳴功能。動態(tài)鏈接庫(DLL:Dynamic-Link Library)是Windows環(huán)境中軟件開發(fā)的重要組成部分也是分布式計算中的組件對象模型(COM)技術的基本支柱之一。使用動態(tài)鏈接庫就可以靈活的設計與實現(xiàn)各類軟件系統(tǒng)。</p><p> 我們可以將動態(tài)鏈接庫看成軟件系統(tǒng)中比較獨立的代碼和資源包。當運行應用程序的可執(zhí)行文件時,在通常情況下,動態(tài)鏈接庫并不立即裝載到
69、系統(tǒng)的內(nèi)存中去,而只是在需要的時候進行動態(tài)的裝載,并將動態(tài)鏈接庫與應用程序的可執(zhí)行文件有機的結合在一起,以共同完成軟件系統(tǒng)的功能。</p><p> 作為Windows系統(tǒng)程序模塊的DLL,不僅可以包含可執(zhí)行代碼,還可以包含數(shù)據(jù)以及其他各種資源。另外,一些設備的驅(qū)動程序也是使用動態(tài)鏈接庫實現(xiàn)的(擴展名一般是DRV)。比如:在Windows系統(tǒng)目錄下有一個名為Comdlg32.DDL的文件,其中就包括了公共對話框
70、的代碼和資源。DLL的用途非常廣泛,這主要是由其特性來決定的。</p><p> ?。?)用DLL可以實現(xiàn)不同程序之間的代碼重用。</p><p> 普通的函數(shù)庫也可以實現(xiàn)不同應用程序之間的代碼重用:將一些通用程序的代碼使用一些比較獨立的函數(shù)來實現(xiàn),這樣在不同應用程序的源代碼中進行直接調(diào)用即可。比如大部分的WindowsAPI函數(shù)就是以函數(shù)庫的形式來提供的。但是使用普通的函數(shù)庫,在程序鏈
71、接時,是將庫中的代碼直接拷貝到可執(zhí)行文件中,這知識一種靜態(tài)鏈接。若在多個同樣的程序執(zhí)行時,則系統(tǒng)中就保留了許多重復的代碼副本,就會造成內(nèi)存資源的浪費。在這種情況下,若使用DLL,則實現(xiàn)的就是動態(tài)鏈接,并不是將庫代碼拷貝,而只是在程序中記錄了函數(shù)的入口點和接口,并只在程序執(zhí)行時才將庫代碼裝入內(nèi)存。這樣,不管有多少個程序同時使用某個DLL,內(nèi)存中都只有這個DLL 的一個副本。當沒有程序使用這個DLL時,系統(tǒng)就將其移出,從而釋放了相應的內(nèi)存空
72、間。</p><p> 本系統(tǒng)利用DLL的這一特點,各個鍵位與音頻鏈接的不同代碼實現(xiàn)了代碼重用,使不同的鍵盤應用程序的源代碼可直接調(diào)用。</p><p> ?。?)DLL技術對于開發(fā)大型軟件系統(tǒng)有很多可用之處。</p><p> 在大型軟件系統(tǒng)中,如果所有的功能均使用一個可執(zhí)行文件來完成,則最終的可執(zhí)行文件將會非常龐大,而且其中還將有許多重復的功能。另外,龐大的
73、可執(zhí)行文件對于軟件的開發(fā)與維護也將是一件非常困難的事情。</p><p> 一個比較好的方法就是使用DLL,將軟件系統(tǒng)分成一個主框架程序和一系列DLL。這樣將會大大降低軟件開發(fā)的復雜度,同時也可以減少開發(fā)的工作量。另外,由于每個模塊都比較小,而且都相對獨立,在運行時也可以提高訪問的速度,增加軟件的運行效率。</p><p> ?。?)DLL可以方便的實現(xiàn)軟件的多國語言版本。</p&
74、gt;<p> 使用DLL就可以方便地支持世界各國的語言。程序員將依賴于語言的函數(shù)和資源分離出來,而專門放進不同的DLL中去。比如,對于中文英文和法文,各自實現(xiàn)一個相對的DLL。在軟件用戶安裝軟件時,將提示選擇相應的語言版本來安裝。所以使用DLL是實現(xiàn)軟件商品國際化的一項技術。</p><p> 本系統(tǒng)可以利用DLL的這一特點,把多種語言的函數(shù)和資源分離,放進專門的DLL中去,可以實現(xiàn)中文、英文
75、等其他語言。</p><p><b> 5系統(tǒng)的詳細設計 </b></p><p> 因本軟件涉及的技術含量較高,技術難度較大,所以詳細設計部分選寫了一部分代碼,此部分代碼是理解這一軟件精華思想所不可或缺的。</p><p> 5.1 設計DLL模塊</p><p> 新建一個project,名稱為Keyboa
76、rdHook, project類型為選擇MFC AppWizard(DLL), DLL類型為MFC Extension DLL(using shared MFC DLL)。</p><p> 步驟1 準備資源文件</p><p> 因本軟件為嘗試性研究,故我未將鍵盤上的按鍵全盤選取,而是精心選取了四十個有代表性的按鍵,每一按鍵對應一個同名聲音文件。</p><p&g
77、t; 將以下聲音文件放到軟件的res子目錄下,在鍵盤上按鍵時,就會播放相應的聲音文件:</p><p> 0.wav、1.wav、2.wav、3 .wav………A.wav、 B.wav、C.wav……LEFT ARROW.wav、 DOWN ARROW.wav……</p><p> 步驟2 創(chuàng)建KeyboardHook.h文件</p><p> 由于VC+
78、+6.0中沒有現(xiàn)成的鉤子類,所以要創(chuàng)建KeyboardHook.h文件,在其中建立鉤子類。KeyboardHook.h文件內(nèi)容如下:</p><p> #if _MSC_VER > 1000</p><p> #pragma once</p><p> #endif // _MSC_VER > 1000</p><p>
79、**************************************************************</p><p> class AFX_EXT_CLASS CKeyboradHook : public CObject</p><p><b> {</b></p><p> // Construction<
80、/p><p><b> public:</b></p><p> CKeyboradHook();</p><p> ~CKeyboradHook();</p><p> BOOL StartHook();</p><p> BOOL StopHook();</p><p
81、><b> };</b></p><p> **************************************************************</p><p> StartHook()函數(shù)實現(xiàn)安裝鉤子,函數(shù)實現(xiàn)卸載鉤子。</p><p> 在KeyboardHook.cpp 文件的頂部加入#include
82、 “ KeyboardHook.h”語句。</p><p> 步驟3 加入全局共享數(shù)據(jù)變量</p><p> 在KeyboardHook.cpp文件中加入共享數(shù)據(jù)段mydata,其中定義兩個變量分別代表安裝的鉤子句柄和DLL實例句柄:</p><p> #pragma data_seg("mydata") </p><
83、p> HHOOK glhKeyboradHook=NULL; //安裝的鍵盤勾子句柄</p><p> HINSTANCE glhkInstance=NULL; //DLL實例句柄</p><p> #pragma data_seg()</p><p> 在KeyboardHook.def 文件中定義段屬性:</p><p>&
84、lt;b> SECTIONS </b></p><p> Mydata READ WRITE SHARED</p><p> 步驟4 類CKeyboardHook的成員函數(shù)</p><p><b> 構造函數(shù)如下:</b></p><p> CKeyboradHook::CKeyboradH
85、ook()</p><p><b> {</b></p><p><b> }</b></p><p><b> 析構函數(shù)如下:</b></p><p> CKeyboradHook::~CKeyboradHook()</p><p><b
86、> {</b></p><p> StopHook();}</p><p> 調(diào)用StartHook函數(shù)可以安裝鉤子:</p><p> **************************************************************</p><p> BOOL CKeyboradHoo
87、k::StartHook() </p><p><b> { </b></p><p> glhKeyboradHook=SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,</p><p> glhkInstance,0); </p><p> if(glhKeyboradHoo
88、k!=NULL) </p><p> return TRUE; </p><p> return FALSE; </p><p><b> }</b></p><p> **************************************************************</p>
89、<p> 在StartHook函數(shù)中主要通過SetWindowsHookEx函數(shù)安裝鉤子。其函數(shù)原形為:</p><p> HHOOK SetWindowsHookEx (int idHook, HOOKPROC lpfn,INSTANCE hMod,DWORD,dwThreadId)</p><p><b> 參數(shù)說明如下:</b></
90、p><p> (1)idHook:鉤子類型,它是和鉤子函數(shù)類型一一對應的。例如,WH_KEYBOARD表示安裝的是鍵盤鉤子,WH_MOUSE表示是鼠標鉤子等等。</p><p> (2) lpfn:鉤子函數(shù)的地址。</p><p> (3) hMod:鉤子函數(shù)所在的實例的句柄,對于線程鉤子,該參數(shù)為NULL;對于系統(tǒng)鉤子,該參數(shù)為鉤子函數(shù)所在的DLL句柄。<
91、/p><p> (4) dwThreadId:指定鉤子所監(jiān)視的線程的線程號。對于全局鉤子,該參數(shù)為NULL。</p><p> SetWindowsHookEx反回所安裝的鉤子句柄。</p><p> 步驟5 根據(jù)判斷播放相應的音樂</p><p> 調(diào)用StartHook函數(shù)后,所有鍵盤的消息都會轉(zhuǎn)移到KeyboradPro函數(shù)中,通
92、過數(shù)組nkey的值與wParam參數(shù)相比較,可以知道用戶按下的是哪個鍵,通過對lParam值的判斷,可以知道用戶按下鍵還是釋放鍵然后播放鍵對應的聲音文件即可:</p><p> LRESULT WINAPI KeyboradProc (int nCode,WPARAM wParam,LPARAM lParam)</p><p><b> {</b></p&g
93、t;<p> for(int i =0;i<TOTAL_KEYS;i++)</p><p><b> {</b></p><p> if(nkey[i]==(int)wParam)</p><p><b> {</b></p><p> int nKeyStatus=l
94、Param & 0x80000000;</p><p> //根據(jù)用戶按鍵播放對應的聲音文件。</p><p> switch(nKeyStatus)</p><p> case 0://WM_KEYDOWN</p><p> //case 0x80000000://WM_KEYUP</p><p>&
95、lt;b> {</b></p><p> CString strFileName;</p><p> char szBuf[256]; </p><p> char *pPath; </p><p> CString strPath; </p><p> GetModuleFileName
96、(glhkInstance,szBuf,sizeof(szBuf)); </p><p> pPath = szBuf; </p><p> while(strchr(pPath,'\\')) </p><p><b> { </b></p><p> pPath = strchr(pPath,&
97、#39;\\'); </p><p><b> pPath++; </b></p><p><b> } </b></p><p> *pPath = '\0'; </p><p> strPath=szBuf; </p><p> strF
98、ileName.Format("%sres\\%s.wav",strPath,cskey[i]); </p><p> sndPlaySound(strFileName,SND_ASYNC);</p><p><b> break;}</b></p><p><b> }</b></p>
99、;<p><b> }</b></p><p> 在此,需要解釋多媒體編程中的一個重要函數(shù):SndPlaySound函數(shù)。SndPlaySound函數(shù)可以直接播放.wav音頻文件。SndPlaySound函數(shù)的第一個參數(shù)lpszPlaySound可以是指定的一個.wav音頻文件名,文件名可以帶絕對路徑,也可以不帶路徑,而只提供文件名。在不帶路徑的情況下,函數(shù)首先在當前目錄下
100、尋找該文件。如果沒有找到的話,那么再根據(jù)標準的目錄搜索次序進行進一步的尋找。SndPlaySound函數(shù)首先假定lpszSound指定的是系統(tǒng)聲音。如果在注冊表中查找不到對應的入口項,則認為lpszSound的值是NULL,則終止當前正在播放的聲音。</p><p> 步驟6 鉤子函數(shù)的卸載</p><p> 在StopHook函數(shù)中,主要通過UnhookWindowsHookEx函
101、數(shù)卸載指定的鉤子。</p><p> BOOL CKeyboradHook::StopHook() </p><p><b> { </b></p><p> BOOL bResult=FALSE; </p><p> if(glhKeyboradHook) </p><p><b&
102、gt; { </b></p><p> bResult= UnhookWindowsHookEx(glhKeyboradHook); </p><p> if(bResult) </p><p><b> { </b></p><p> glhKeyboradHook=NULL; </p>
103、;<p><b> } </b></p><p><b> } </b></p><p> return bResult; </p><p><b> }</b></p><p> ************************************
104、******************************</p><p> KeyboardHook.cpp文件的內(nèi)容如下:</p><p> // KeyboardHook.cpp : Defines the initialization routines for the DLL.</p><p><b> //文件包含。</b>&
105、lt;/p><p> #include "stdafx.h"</p><p> #include "Mmsystem.h"</p><p> #include <afxdllx.h></p><p> #include "KeyboardHook.h"</p&g
106、t;<p><b> //預編譯。</b></p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;<
107、;/p><p><b> #endif</b></p><p> #define TOTAL_KEYS 40</p><p> //存儲各個鍵對應的鍵值。</p><p> CString cskey[TOTAL_KEYS]=</p><p> {"LEFT ARROW"
108、,//VK_LEFT 25 LEFT ARROW key </p><p> "UP ARROW",//VK_UP 26 UP ARROW key </p><p> "0",//30 0 key</p><p> "1",//31 1 key </p><p>&
109、lt;b> ……………</b></p><p> "A",//41 A key </p><p> "B",//42 B key </p><p><b> …………… </b></p><p><b> };</b>&
110、lt;/p><p> int nkey[TOTAL_KEYS]=</p><p><b> {</b></p><p> 0x25,//"LEFT ARROW",//VK_LEFT 25 LEFT ARROW key </p><p> 0x26,//"UP ARROW",/
111、/VK_UP 26 UP ARROW key </p><p><b> …………</b></p><p> 0x30,//"0",//30 0 key </p><p> 0x31,//"1",//31 1 key </p><p><b> ……………&
112、lt;/b></p><p> 0x41,//"A",//41 A key </p><p> 0x42,//"B",//42 B key </p><p><b> ……………</b></p><p><b> };</b></p&g
113、t;<p> #pragma data_seg("mydata") </p><p> //安裝的鍵盤勾子句柄</p><p> HHOOK glhKeyboradHook=NULL;</p><p> //DLL實例句柄 </p><p> HINSTANCE glhkInstance=NULL;
114、</p><p> #pragma data_seg() </p><p> //#pragma comment(linker,"/SECTION:mydata,RWS")</p><p> static AFX_EXTENSION_MODULE KeyboardHookDLL = { NULL, NULL };</p>&l
115、t;p> extern "C" int APIENTRY</p><p> DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID </p><p> lpReserved) //類構造函數(shù) </p><p> CKeyboradHook::CKeyboradHook(){}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂本科畢業(yè)論文
- 音樂教育本科畢業(yè)論文
- 音樂教育本科畢業(yè)論文
- 音樂學專業(yè)本科畢業(yè)論文
- 軟件學院本科畢業(yè)論文設計
- 音樂學專業(yè)本科畢業(yè)論文
- 本科畢業(yè)論文—算法動態(tài)演示軟件設計與開發(fā)——鏈表操作
- 軟件開發(fā)設計外文翻譯文獻本科畢業(yè)論文
- 本科畢業(yè)論文
- 淺論歌唱的共鳴-音樂學本科畢業(yè)論文
- 軟件缺陷管理平臺-本科畢業(yè)論文
- 本科畢業(yè)論文
- 本科畢業(yè)論文
- 淺論歌唱的共鳴-音樂學本科畢業(yè)論文
- 本科畢業(yè)論文軟件工程設計
- 數(shù)學本科畢業(yè)論文
- 本科畢業(yè)論文_5833
- 本科畢業(yè)論文正文
- 體育本科畢業(yè)論文
- 本科畢業(yè)論文(設計)
評論
0/150
提交評論