鍵盤巨集程式 SUPERKEY


[ 個人電腦的鍵盤輸入架構 ] [ 規劃 8042 UPI 晶片 ] [ 鍵盤緩衝區的構造與鍵盤服務常式 ] [ ASCII 碼與延伸碼 ] [ 保護螢幕的 SLEEP 程式 ] [ 鍵盤巨集程式 SUPERKEY ]

 

 

 

 

 

 

 

 

 

BS00858A.gif (917 bytes)
SuperKey 為一定義巨集鍵的程式, 使用者可依自己的喜好而將欲從鍵盤輸入的字串定義成任何鍵的組合。如果者使用大量的巨集鍵, 則亦可設計成將命令群搜集成檔案, 然後於執行期再載入, 當面對不同的對象, 便可使用不同的鍵盤巨集。程式中亦可增加檢查密碼的功能, 作為設計 Lock Screen 之用。


<SuperKey.C>


SendBuffer 的功能在於將指定的字串送到鍵盤緩衝區, 這裡使用 keyboradBuffer、front 和 rear 將緩衝區的存取方式 Normalize 成標準的循環佇列, 送出的鍵碼倘若包含掃瞄碼的話, 可從 scanTable 查出其對應的掃瞄碼。如果指定的字串長度大於目前緩衝區所能容納的個數, 則 Continue 旗標會被設定, 然後將剩餘的字串的啟始位址傳回。注意 BufferStartOfs、BufferEndOfs、CatchHeadOfs 和 CatchTailOfs 等四處記錄的均是偏移位址(Offset), 所參考的節區位址為 0040h。

newKeyboard 藉著檢查掃瞄碼, 判斷按鍵是否程式所設定的熱鍵(Hotkey); 若檢查結果為是, 則設定 Busy 旗標以防止 newKeyboard 的程式碼重複進入, 然後設定 MacroString 經由 SendBuffer 送出。 SendBuffer 是掛在 newClock 上面, 所以會週期性的執行, 直到字串送完為止, 因為 Int08h 的啟動有 1/18.2 秒的間隔, 所以如果指定的字串遠大於鍵盤緩衝區時, 可感覺到明顯的延遲副效應。SendBuffer 也可以掛在 Int16h 上,程式要求讀鍵時就送出字串, 這樣就不會有掛在 newClock 上的缺點, 兩者的差別在於前者屬主動(硬體中斷觸發)、後者屬被動(程式呼叫)。monitorKeyboard 中的 InBios 旗標主要用來監督 OldInt16 的動作, 避免其讀取的動作與 SendBuffer 的寫入動作同時進行。

newKeyboard 中面臨一個大問題, 當 newKeyboard 先行讀取掃瞄碼作檢查分析後再呼叫 OldInt09 時, 其中間隔的時間可能使得第二次讀出的掃瞄碼已經與第一次不同, 這樣便使得 OldInt09 遺漏一些鍵, 這現象在 TSRPLUS 也曾出現過, 如果遺漏的是移位鍵, 則可能因 ShiftStatus 未獲適當更新而使往後的輸入不是預期的輸入。解決的策略有二: 其一, 由 newKeyboard 的設計加以改變, 例如AG00073_.gif (9093 bytes) checkShiftStatus 花費的時間可能使得 UPI 資料暫存器的值已改變, 這時便不要再呼叫 OldInt09, 而由程式中負責 ShiftStatus 的更新, 就 Int09 處理種種不同的按鍵而言, 這項任務是相當輕鬆容易的, 這可能是某些常駐軟體常以移位鍵啟動的原因(ie. 連按兩下 Ctrl 鍵)。其二是由鍵盤操作者的使用上來解決, 當設定的熱鍵包含移位鍵時, 移位鍵必須在整個字串送完之後再鬆開; 或者是當移位鍵的狀態與ShiftStatus 記錄不符而導致鍵盤輸入失常時, 再按一下熱鍵中的移位鍵也可重設 ShiftStatus 而恢復鍵盤正常功能。