摘要:Visual Basic 2005 - 如何於控制項中捕捉按鍵
如何於 Windows Form 控制項中捕捉按鍵向來是許多程式設計師所關心的課題,基本上,標準的 KeyUp、KeyDown 與 KeyPress 事件就足以去捕捉並處理按鍵。然而問題在於,並非所有的控制項會在所有的情況下替所有的按鍵動作產生這些事件。
如果您希望不管控制項的狀況為何,都能夠順利捕捉 Windows Form 控制項中的按鍵,必須根據該控制項的類別衍生出一個新的類別並覆寫 ProcessCmdKey 方法,並於此覆寫方法中撰寫程式碼來捕捉並處理您所需的按鍵。系統會傳第兩個參數給 ProcessCmdKey 方法:msg 與 keyData。msg 參數內含所要處理的視窗訊息(例如: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 = "
Case (Keys.Control Or Keys.Home)
Me.Parent.Text = "
Case (Keys.Control Or Keys.End)
Me.Parent.Text = "
Case (Keys.Control Or Keys.M)
Me.Parent.Text = "
Case (Keys.Alt Or Keys.Z)
Me.Parent.Text = "
End Select
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
本文節錄自「Visual Basic 2005程式開發與介面設計秘訣」一書,特此聲明之。Visual C# 2005的使用者請參閱「Visual C# 2005程式開發與介面設計秘訣」一書。
章立民研究室