鍵盤巨集程式SUPERKEY

文章推薦指數: 80 %
投票人數:10人

SuperKey 為一定義巨集鍵的程式, 使用者可依自己的喜好而將欲從鍵盤輸入的字串定義成任何鍵的組合。

如果者使用大量的巨集鍵, 則亦可設計成將命令群搜集成檔案, ... [個人電腦的鍵盤輸入架構][規劃8042UPI晶片][鍵盤緩衝區的構造與鍵盤服務常式][ASCII碼與延伸碼][保護螢幕的SLEEP程式][鍵盤巨集程式SUPERKEY]                   SuperKey為一定義巨集鍵的程式, 使用者可依自己的喜好而將欲從鍵盤輸入的字串定義成任何鍵的組合。

如果者使用大量的巨集鍵, 則亦可設計成將命令群搜集成檔案,然後於執行期再載入, 當面對不同的對象, 便可使用不同的鍵盤巨集。

程式中亦可增加檢查密碼的功能, 作為設計LockScreen之用。

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的設計加以改變,例如checkShiftStatus 花費的時間可能使得UPI資料暫存器的值已改變,這時便不要再呼叫 OldInt09,而由程式中負責ShiftStatus的更新,就Int09 處理種種不同的按鍵而言,這項任務是相當輕鬆容易的, 這可能是某些常駐軟體常以移位鍵啟動的原因(ie.連按兩下Ctrl鍵)。

其二是由鍵盤操作者的使用上來解決, 當設定的熱鍵包含移位鍵時,移位鍵必須在整個字串送完之後再鬆開; 或者是當移位鍵的狀態與ShiftStatus記錄不符而導致鍵盤輸入失常時, 再按一下熱鍵中的移位鍵也可重設ShiftStatus而恢復鍵盤正常功能。



請為這篇文章評分?