第二章 . 相關研究探討
2.2 一般滑鼠取樣的方式
視窗硬體輸入模型
視窗硬體輸入模型[6]是 Windows 系統處理輸入裝置輸入,將其轉換為應用程式 訊息的過程。下圖是處理的流程。
圖 7 視窗硬體輸入模型處理流程[6]
處理流程共分為三大步驟:
1. 當輸入裝置發出硬體事件,該硬體事件由裝置驅動程式負責處理。
2. 裝置驅動程式處理完會將該事件放入系統輸入佇列,並喚醒原始輸入執行 緒。
3. 被喚醒的原始輸入執行緒先由系統輸入佇列取出硬體事件,並將其轉換為 相對的訊息,例如滑鼠左鍵按下的訊息,會被轉換為 WM_LBUTTONUP 的訊 息,並送至適當的執行緒的虛擬輸入佇列。
上述步驟 3 中適當的執行緒是指在事件發生時,應當接收該訊息的執行緒,例如當 滑鼠在上圖的 Window A1 上移動時,原始輸入執行緒會將 WM_MOUSEMOVE 的訊息及滑鼠 的座標,發送至對應於 Window A1 的 Thread A 的虛擬輸入佇列中。
WM_LBUTTONUP 代表放開滑鼠左鍵
WM_MOUSEMOVE 代表滑鼠移動
WM_RBUTTONDOWN 代表按下滑鼠右鍵
WM_RBUTTONUP 代表放開滑鼠右鍵
當視窗訊息處理程式中收到滑鼠訊息時,其 lParam 參數代表了該訊息發生的座標,
而 rParam 代表其他按鍵的狀態。滑鼠訊息屬於 2.1.1 節中的佇列式訊息。
滑鼠訊息的處理流程如下圖所示:
圖 8 滑鼠訊息在應用程式的處理流程
2.3 造成程式視覺回饋效果不好的原因 2.3.1 取樣數量不足
Microsoft Developer Network (MSDN)上提到,當訊息處理程式來不及處理滑鼠訊 息時,Windows 系統會盡可能使其取得更多的滑鼠訊息[7],也就是滑鼠訊息在程式過 度忙碌時會有遺失的現象。
滑鼠繪圖類型的程式往往會對手繪的顯示方式處理,例如柔化線條的邊緣…等,往 往會消耗系統運算資源,使得處理時間變長,因此影響到視窗程式取得滑鼠訊息的數量。
滑鼠取樣不足的問題在以滑鼠或手寫式裝置寫字或是畫曲線時效果更加明顯不
佳。因為畫圖程式往往會直接將取樣到的點以直線相接的方式反應在畫面上,當取樣點 數不足時,將使其線段相接的轉角處更加的明顯。
Paint.Net 軟體是一套在 Windows 平台上的畫圖軟體。下圖是當系統內負載較高 時,由 Paint.Net 軟體畫出的線條軌跡,原本要畫出一條曲線,但是由於系統的工作量 較多,造成取樣不足,使得其中的取樣點的間隔相當明顯。
圖 9 以視窗滑鼠訊息方式取樣的效果
下圖為將上圖方框取出後放大兩倍之後的結果,可見到圓圈圈出的地方有明顯發生 折線的現象。
圖 10 明顯發生折線處
圖 11 順線前的線條
由於該工具的順化線條功能會在使用其提供的橡皮擦工具被觸發,下圖是將最右邊 的線條使用橡皮擦工具清除後,畫面被順化線條功能處理完的結果。
圖 12 順線後的線條
彎曲較多的線條被修正成曲線,但是修正的同時也造成線條的失真。
2.3.2 取樣時間過長
當滑鼠事件發生後,必須先由驅動程式處理,再由原始輸入執行緒發派到適當執行 緒的虛擬輸入佇列裡。由於滑鼠訊息本身為佇列式訊息,應用程式必須在訊息迴圈使用 Windows API 取出並解讀訊息,並發送至適當的視窗訊息處理程式。當視窗訊息處理程 式接收到滑鼠訊息後,尚需執行相關的繪圖指令,將視覺回饋效果反應至使用者。
若滑鼠事件處理流程使用的時間和使用者觸發滑鼠事件的總和時間間隔太長,使得 使用者從操作事件發生後到視覺回饋的時間太久,會導致使用者有程式反應太慢的觀 感。另外因為取樣的時間變長,使得在同樣時間內的取樣次數變少,進而造成取樣數不 足的問題。
第三章.
取樣模組的分析與設計
3.1 加強視覺回饋問題的策略 3.1.1 可能加以改良的方向
從滑鼠事件發生到應用程式處理完畢的處理流程如下圖:
圖 13 簡化的滑鼠事件處理流程
從輸入事件被轉換為訊息乃至於訊息被放至適當的程式輸入佇列為止,是由原始輸 入執行緒處理負責,因為是由系統提供的機能而無法修改,另外將訊息轉換為視覺回饋 是由繪圖的程式完成,由搭配滑鼠取樣模組負責。因此滑鼠取樣模組可加以強化的只有 這兩個部分:滑鼠驅動程式發送輸入事件以及應用程式由輸入佇列接收訊息的行為。以 下針對相對應的修改驅動程式和加速滑鼠訊息發送至訊息佇列這兩個不同方向的優缺 點作分析說明:
z
修改驅動程式
以驅動程式強化滑鼠取樣的方法即可以在滑鼠事件被轉換為滑鼠訊息前 就先攔截並加以處理。但是因為驅動程式是在核心模式下執行,必須設計驅動
程式與應用程式溝通的介面,另外驅動程式需要預先在系統內被安裝才能使 用。
z
加速訊息發送至應用程式的時間
這個部分的優點是不需要預先安裝或是導致該程式需要以系統管理員的 權限,才可以使用該模組的應用程式。若在其他應用的程式不需要在系統裡留 下設定的情況下,可搭配成為綠色軟體(Green Software)[9],但是因為取得 的資料已被原始輸入執行緒處理過,取得的滑鼠訊息會受原始輸入執行緒的限 Windows Hook 的機制將滑鼠訊息以非佇列式訊息先發送至接收視窗的訊息處理程式,繞 過訊息迴圈進行處理,節省滑鼠訊息停留在訊息迴圈的時間。 業的 Management Information System (MIS)[10]管控,在使用時就需要先由 MIS
處理程式將原先的滑鼠訊息轉換成對應的非佇列式訊息即完成整合,而不需對原先 訊息驅動的架構做調整,減輕修改程式的負擔。
第四章. 模組設計與實作
4.1 模組概觀
滑鼠取樣模組的主體為一 Dynamic Link Library (DLL)檔案,使用模組的程式需透 過 LoadLibrary API 將模組載入使用,並呼叫模組的 OpenPen 和 ClosePen API 作為開 始和結束取樣的操作。再經由 GetPoint API 解讀並轉換完成非佇列式訊息,在將原本 處理滑鼠訊息的部分代換為處理本模組的訊息。
4.1.1 模組架構圖
本論文的模組內提供的應用程式介面
表 1 本論文提供的應用程式介面
名稱 說明
OpenPen 開始取樣
Close 結束取樣
GetPoint 取得該點的滑鼠資料
下圖為本模組的架構,主要由 Hook Callback Function 和提供呼叫的應用程式介 面組成,Hook Callback Function 負責攔截滑鼠訊息後的處理工作,而使用本取樣模組 的繪圖程式呼叫應用程式介面以使用本模組的功能:
窗程式的處理佇列前先被接收。第二、是使用 Windows Hook 機制可不需在系統裡進行 安裝,允許在較低權限的帳戶下直接使用,如果使用驅動程式的方式進行取樣,則需要 以較高權限的帳號進行安裝設定才能使用,導致用此模組的軟體就不可能成為綠色軟 體。
圖 15 滑鼠取樣模組運作方式
4.2.2 滑鼠訊息轉換成的非佇列訊息
滑鼠事件包含了事件的發生和該事件的相關資料,例如:指標的位置…等。本論文 以兩種不同的非佇列訊息分別進行事件傳遞,並且在實驗內針對效率加以比較。整合時 應用程式只需修改訊息處理函式處理滑鼠訊息的部分為接收對應產生的訊息,並且呼叫 解讀訊息的 API,再將訊息處理改為原本應用程式對應的訊息處理方式即可,而不需對 應用程式的處理流程或架構另做修改。
可供轉換的非佇列式訊息有以下兩種:
1. WM_COPYDATA 訊息
WM_COPYDATA[11]是 Windows 系統提供給應用程式作為少量資料行程間通訊的 訊息,使用時對接收資料的客戶端視窗程式以 SendMessage API 傳送 WM_COPYDAYA 訊
息,並且將要傳遞的資料其位址和大小加入參數中即可。接收端的訊息處理程式只需 要對 WM_COPYDATA 訊息做適當的處理。
2. 應用程式自訂訊息( Application Defined Message )
Windows 系統提供了自訂訊息[3]讓程式設計師建立自己使用的訊息,該訊息的 數值需位於 WM_APP 的實際數值和 0xBFFF 的區間內。
本論文以此兩種訊息設計了兩種不同轉換滑鼠訊息的方法:
1. WM_COPYDATA 方式
利用 WM_COPYDATA 訊息負責觸發滑鼠事件的處理和相關資料的傳遞。由於 WM_COPYDATA 本身具有傳遞資料的能力,滑鼠事件的相關資料由該訊息的參數傳遞 至視窗處理程式。
本設計如下圖:
義為 WM_BWDLL,當應用程式收到該訊息時,呼叫該 API 以取得事件的相關資料。
本設計如下圖:
圖 17 自訂訊息中斷方式運作流程
4.2.3 滑鼠訊息和本論文使用訊息的比較
下表為三種訊息於用途上的比較:
表 2 滑鼠訊息和本論文轉換後的非佇列式訊息在用途上的比較
用途 傳遞滑鼠事件方式
滑鼠訊息
負責提示應用程式滑鼠事件發生 由視窗處理程式的參數傳遞。
WM_COPYDATA 訊息 少量資料行程間通訊。
由視窗處理程式的參數傳遞,
供 應 給 程 式 自 訂 通 知 訊 息 使 用。
應用程式自訂訊息 由訊息處理程式的參數
傳遞。
模組需提供 API,於訊息到達時 由呼叫 API 取得事件內容。
4.2.4 應用端程式開發 DDR400 512MB
Windows XP Professional 手寫數位板規格 WACOM BAMBOO
電子白板規格 Jector jp835xsp
1. 以滑鼠為輸入裝置得到的結果
表 4 以滑鼠為輸入裝置得到的結果,單位為毫秒(millisecond)
滑鼠訊息 WM_COPYDATA 訊息 應用程式自訂訊息
表 5 以手寫數位板為輸入裝置得到的結果,單位為毫秒(millisecond)
滑鼠訊息 WM_COPYDATA 訊息 應用程式自訂訊息
3. 以電子白板為輸入裝置得到的結果
表 6 以電子白板為輸入裝置得到的結果,單位為毫秒(millisecond)
滑鼠訊息 WM_COPYDATA 訊息 應用程式自訂訊息
第一次 12.145 1.426 0.573
第二次 12.261 2.113 0.019
第三次 11.245 3.539 0.673
第四次 9.549 0.853 0.086
第五次 13.725 0.85 0.052
平均 11.4018 1.7562 0.2806
2 4 6 8 10 12
( millisencond )
各取樣1000點5次的平均時間
0
0
表 7 以滑鼠裝置的滑鼠取樣時間與繪圖工作時間的預測取樣點數(單位:點數)
繪圖工作時間 (MS) 滑鼠取樣方式
10 20 30 40 50 60 70 80
滑鼠訊息方式 61 38 28 25 18 15 13 12
WM_COPYDATA 訊息方式 91 48 32 22 20 16 14 12
自訂訊息中斷方式 100 50 33 24 20 17 14 13
表 8 以手寫數位板的滑鼠取樣時間與繪圖工作時間的預測取樣點數(單位:點數)
表 8 以手寫數位板的滑鼠取樣時間與繪圖工作時間的預測取樣點數(單位:點數)