20. 鍵 盤

如何改變Enter鍵的行為?
 

改變字鍵原有的行為並不符合標準的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應用程式,這裡也對熱鍵的做了詳盡的展示介紹。