一個成功的應用系統,總是離不開鍵盤的輸入。也就是說,應用軟體需要通過 鍵盤等工具,來與使用者進行互動。雖然這是一項基礎性的工作,但是其中還是包 含了很多技巧。在VisualStudio2010中,總的來說,還是通過處理鍵盤事件來接 受來自鍵盤的資訊。筆者這裡就以Windows表單為例,談談在接受鍵盤輸入時的一 些技巧。
一、Keydown事件。
Keydown事件是使用者敲擊鍵盤時觸發的一個事件。這是一個初始觸發事件,即 當使用者一按鍵盤時就觸發了這個事件。掌握好這個事件的相關內容,是開發人員 處理鍵盤輸入的基礎。筆者認為,可以從如下幾個方面來進行瞭解。
一是掌握KeyEventArgs參數。簡單的說,這個參數指定一個物理鍵盤按鈕。不 過隨著硬體的升級,其功能已經遠遠不止這麼一個了。如現在鍵盤上都有按鍵組合 的功能。如現在需要在英文小寫狀態下輸入一個大寫的字元,則需要使用Shift與 任意一個字元的按鍵組合。再如需要輸入數字鍵上面的特殊符合,也需要採用Shift 按鍵組合等等。應用軟體需要判斷使用者是否使用了按鍵組合,此時就需要藉助這個參 數。也就是說,在VisualStudio2010中編寫代碼時,可能需要使用一個IF語句或 者其它類似的文法來判斷使用者是否採用了按鍵組合。
二是瞭解Modiiers屬性的含義。注意,在這裡不能夠顧名思義。其實這個屬性 會跟上面這個參數結合使用。剛才我們講過,使用者可能在輸入時會使用按鍵組合。 現在的一個問題時,我們常用的按鍵組合有三個,分別為Shift、Ctrl和Alt。不同 的按鍵組合與其它鍵結合,往往起到不同的效果。為此應用程式不僅要知道,使用者 是否同步選取了多個鍵,還需要瞭解,使用者按下的是哪個按鍵組合。這個屬性就是 用來記錄使用者按下的是以上三個鍵中的哪一個。在編寫代碼的時候,可能需要使 用Case語句來根據使用者的行為在選擇不同的操作。
三是DeyDate屬性。在Windows作業系統中,可以同步選取Shift、Ctrl和Alt三 個鍵。此時系統會跳出工作管理員。在應用程式開發過程中,使用者可能也需要同 時按下這三個鍵來完成特定的任務。此時需要使用的屬性就是Keydata屬性。通常 情況下,開發人員可以使用來自Keys 的常數從Keydata屬性中提取資訊。同時使 用And運算子(表示同步選取三個鍵)將由Keydata返回的資料與Keys中常數進行比 較,從而獲得有關使用者按下鍵的資訊。
瞭解了這幾個參數與屬性之後,基本上就掌握了Keydown事件。筆者再次強調 一下,Keydows事件是應用程式接受鍵盤輸入的一個必須要經過的環節。開發人員 必須要掌握。
二、KeyPress事件。
這個事件也是在使用者按下鍵盤時觸發的。不過其觸發的順序比較晚。也就是說 ,在Keydown事件被成功觸發之後,才會觸發這個事件。兩者之間有先後的順序。 這是掌握這個事件時需要知道的第一個內容。
另外,這個Keypress事件也並不是對所有的鍵都敏感。一般來說,當使用者按的 鍵會產生字元時才會觸發這個時間。即當使用者按的是鍵盤上的數字鍵時不會觸發 這個事件。而上面提到的第一個事件,則是在任何情況下,只要使用者按下了鍵盤 的按鈕,就會觸發的。不過需要注意的是,有時候當使用者按下任意鍵時,也會觸 發這個Keypress事件。這就是這兩個事件的第二個區別。
在這個事件中,主要使用了一個KeyPressEventArgs參數。簡單的說,這個參 數主要用來代表所按鍵的字元代碼。因為字元代碼對於字元鍵和按鍵組合的每個組 合都是唯一的,為此這個參數的值也是唯一的。例如同樣是鍵盤上的字元A鍵,在 不同的情況下會產生不同的字元代碼。如在大寫修飾鍵開啟與關閉的情況下,當 使用者按下這個字元A鍵時,其後台產生的字元代碼是不同的。在編寫代碼的時候, 開發人員不用瞭解到底使用者是在什麼情況下按下某個按鈕的。只需要知道,不同 的字元代碼代表什麼意思。如字元代碼65就表示使用者同步選取了Shift鍵與A鍵。 此時在代碼中,就需要根據鍵盤當前的狀況來決定後續的行為。如鍵盤當前處於 大寫狀態下,則表示使用者想輸入的資訊是小寫字元a。反之,則表示使用者想輸入的 資訊為大寫字元A。
最後需要注意的一點是,開發人員在必要的時候,可以取消這個事件。也就是 說,即使使用者按下了鍵盤上的按鈕,也不觸發這個事件。在某些情況下,這個功 能還是蠻有用的。如當某帳單據已經審核,不允許再進行任何的更改。或者說, 只允許使用者通過滑鼠來操作,而不允許通過鍵盤來操作。簡單的說,就是需要系 統忽略使用者的鍵盤輸入,此時就需要使用這種方法。其實實現的手段也很簡單, 只需要使用Handled屬性即可。當將這個屬性設定為True時,就會取消 Keypress 事件。