Visual Basic 2005 - 如何於控制項中捕捉按鍵

摘要:Visual Basic 2005 - 如何於控制項中捕捉按鍵

如何於 Windows Form 控制項中捕捉按鍵向來是許多程式設計師所關心的課題,基本上,標準的 KeyUpKeyDown KeyPress 事件就足以去捕捉並處理按鍵。然而問題在於,並非所有的控制項會在所有的情況下替所有的按鍵動作產生這些事件。

如果您希望不管控制項的狀況為何,都能夠順利捕捉 Windows Form 控制項中的按鍵,必須根據該控制項的類別衍生出一個新的類別並覆寫 ProcessCmdKey 方法,並於此覆寫方法中撰寫程式碼來捕捉並處理您所需的按鍵。系統會傳第兩個參數給 ProcessCmdKey 方法:msg keyDatamsg 參數內含所要處理的視窗訊息(例如:WM_KEYDOWN),此視窗訊息是以傳址方式傳遞的。keyData 參數則會內含被按下之按鍵的按鍵碼,也就是其中一個 Keys 值(註:keyData 參數的型別是 Keys 列舉型別)。如果 CTRL ALT 鍵也被按下,keyData 參數還會內含輔助按鍵(Modifier Key)資訊。

您並非一定非得使用 msg 參數不可,也就是說,您可以忽略它。不過利用 msg 參數來檢測視窗訊息倒是一項不錯的選擇。在稍後的程式範例中,我們會去檢測視窗訊息是否為 WM_KEYDOWN 以便確認這是一個按鍵事件,此外,我們也會去檢測視窗訊息是否為 WM_SYSKEYDOWN 以便確認按鍵組合是否包含輔助按鍵。

 


圖表 1

 

由於 DataGridView 控制項的狀況最為複雜,因而在此我們就要示範如何於 DataGridView 控制項中捕捉按鍵,請切記,您可以將同樣的手法應用在其它的控制項。圖表 1 所示者是我們所撰寫之程式範例的執行畫面,從表單的標題列變化可以看出,只要 DataGridView 控制項取得焦點,而且不論它是否顯示資料,都能夠捕捉使用者於 DataGridView 控制項中的按鍵。顯而易見地,本程式範例的關鍵就在於必須根據 DataGridView 控制項衍生出一個新的類別並覆寫其 ProcessCmdKey 方法,茲將衍生類別 MyDataGridView 的程式碼列示如下:

Public Class MyDataGridView
  Inherits System.Windows.Forms.DataGridView
 
 

  Protected Overrides Function ProcessCmdKey(ByRef msg As Message, _
                         ByVal keyData As Keys) As Boolean
    Const WM_KEYDOWN As Integer = &H100
    Const WM_SYSKEYDOWN As Integer = &H104


    If ((msg.Msg = WM_KEYDOWN) Or _
       (msg.Msg = WM_SYSKEYDOWN)) Then
        Select Case (keyData)
            Case Keys.Down
                Me.Parent.Text = "
向下鍵已經被捕捉"
            Case Keys.Up
                Me.Parent.Text = "
向上鍵已經被捕捉"
            Case Keys.Left
                Me.Parent.Text = "
向左鍵已經被捕捉"
            Case Keys.Right
                Me.Parent.Text = "
向右鍵已經被捕捉"
            Case Keys.Home
                Me.Parent.Text = "Home
鍵已經被捕捉"
            Case Keys.End
                Me.Parent.Text = "End
鍵已經被捕捉"
            Case Keys.PageUp
                Me.Parent.Text = "PageUp
鍵已經被捕捉"
            Case Keys.PageDown
                Me.Parent.Text = "PageDown
鍵已經被捕捉"
            Case Keys.Tab
                Me.Parent.Text = "Tab
鍵已經被捕捉"
            Case (Keys.Shift Or Keys.Tab)
                Me.Parent.Text = " + Tab
鍵已經被捕捉"
            Case (Keys.Control Or Keys.Home)
                Me.Parent.Text = " + Home
鍵已經被捕捉"
            Case (Keys.Control Or Keys.End)
                Me.Parent.Text = " + End
鍵已經被捕捉"
            Case (Keys.Control Or Keys.M)
                Me.Parent.Text = " + M
已經被捕捉"
            Case (Keys.Alt Or Keys.Z)
                Me.Parent.Text = " + Z
已經被捕捉"
        End Select
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
  End Function
End Class

本文節錄自Visual Basic 2005程式開發與介面設計秘訣」一書,特此聲明之。Visual C# 2005的使用者請參閱Visual C# 2005程式開發與介面設計秘訣」一書。

章立民研究室 2007/1/8