20. 鍵 盤
改變字鍵原有的行為並不符合標準的Visual Basic程式設計的慣例,但有時候你需要把
鍵變成
鍵,讓
鍵被按下後和按下
鍵的效果一樣,以便把駐點(Focus)從一個控制項移到下一個控制項上。以下這段程式把這種技巧運用在一個文字方塊控制項上,當然你可以把這個技巧用在控制項的KeyPress事件裡。
Private Sub txtText1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
SendKeys "{tab}"
KeyAscii = 0
End If
End Sub
當字鍵被按下時,它的ASCII碼以參數KeyAscii傳給KeyPress事件,
鍵的ASCII值是13,這是Visual
Basic內建常數vbKeyReturn的值。SendKeys可以送出任何按鍵值(Keypress)給目前正在運作的視窗(SendKeys陳述式可以讓你的應用程式送出按鍵值給其他以Windows為基礎的應用程式)。字串"{tab}"代表SendKeys所送出按鍵值,就如同鍵盤的
鍵被按下了一樣。為了要取代
鍵原來的動作,你必須把KeyAscii的值設為0,否則系統會發出聲響。
如果只是要故意忽略所有的
按鍵值,不作額外的動作,那麼只要指定0給KeyAscii即可,不必使用SendKeys去取代任何按鍵值。
如何判斷變換鍵的狀態?
KeyPress事件並不會直接檢查
、
、和
鍵(統稱為變換鍵),但是變換鍵的狀態的確會影響按下的字鍵(改變了字母的大小寫)。如果想要偵測這些變換鍵的狀態,可以用KeyDown和KeyUp事件。在KeyDown和KeyUp事件程序中,你可以直接利用變換鍵的狀態作你想做的動作;或者也可以把變換鍵的狀態放在模組層次的變數裡。第二種方法讓你可以從KeyPress事件程序或從模組中其他的程式碼中,讀取到變換鍵的狀態。
以下這個範例所執行的工作是:每當任何一個變換鍵被按下或放開時,它會立即顯示代表變換鍵狀態的Boolean值。我們用Visual Basic的常數vbShiftMask、vbCtrlMask和vbAltMask來偵測變換鍵的狀態,並且傳出一個Boolean值。要使得這段程式可以在整個表單上運作,一定要把表單的KeyPreview屬性設定為True,這樣,不管是哪個控制項取得了駐點,程式都能立即檢查變換鍵的狀態。
Option Explicit
Private mblnShiftState As Boolean
Private mblnCtrlState As Boolean
Private mblnAltState As Boolean
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
mblnShiftState = (Shift And vbShiftMask)
mblnCtrlState = (Shift And vbCtrlMask)
mblnAltState = (Shift And vbAltMask)
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
mblnShiftState = (Shift And vbShiftMask)
mblnCtrlState = (Shift And vbCtrlMask)
mblnAltState = (Shift And vbAltMask)
End Sub
Private Sub tmrTest_Timer()
Cls
Print "Shift = "; mblnShiftState
Print "Ctrl = "; mblnCtrlState
Print "Alt = "; mblnAltState
End Sub
現在讓我們來建立一張新表單,表單中加入以上的程式,再加入一個計時器控制項tmrTest。把計時器控制項的Interval屬性設為100,使程式每0.1秒偵測變換鍵的狀態一次。這樣,程式就可以執行了。你可以試試一起按下二個以上的變換鍵,看看輸出的結果。圖20-1顯示的是
和
被同時按下的結果。
| 圖20-1 變換鍵的狀態 |
如何設定熱鍵?
Visual Basic表單中的KeyPreview屬性是設定熱鍵(Hot Key)的最佳管道,這個屬性讓你的應用程式對任何按鍵組合都能有所回應,這些按鍵組合包括功能鍵、變換鍵加功能鍵、或是數字鍵盤上的數字鍵等等。
設定熱鍵的基本技巧為:首先設定表單的KeyPreview屬性為True,在表單的KeyDown事件程序中檢查所要設定的按鍵值,並針對該按鍵值採取適當的處置。在以下的範例中,我們檢查
、
鍵,以及
鍵加上任何一個變換鍵。常數vbKeyF1、vbKeyF2、和vbKeyF3用來判斷是哪一個功能鍵被按下。
提醒你一下,這種技巧只能偵測少數幾個鍵,如果要偵測的鍵相當多,程式會變得很長,在這種情況下用前一節所用的技巧,可以簡化偵測按鍵值的程式。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF1
Print "F1"
Case vbKeyF2
Print "F2"
Case vbKeyF3
If (Shift And vbShiftMask) Then
Print "Shift-F3"
ElseIf (Shift And vbCtrlMask) Then
Print "Ctrl-F3"
ElseIf (Shift And vbAltMask) Then
Print "Alt-F3"
Else
Print "F3"
End If
End Select
End Sub
圖20-2所顯示是範例執行的情形。最後,要提醒你的是,儘管Command1取得了駐點,但在Command1接收到按鍵值之前,這些按鍵值已經被表單早一步攔截了下來。
| 圖20-2 熱鍵展示範例 |
參考資料:
請參閱
第三十二章"資料庫" 中的Jot應用程式,這裡也對熱鍵的做了詳盡的展示介紹。