本文將逐步告訴您,如何補漏白的 Windows Form 控制項的按鍵動作。本文使用範例程式碼,您可以攔截幾乎任何個別的按鍵動作。您也可以攔截包括 CTRL 和 ALT 的按鍵組合。這項技術不會擷取列印螢幕索引鍵。此外,可能無法擷取從使用例如網頁瀏覽器或 CD-ROM 玩家控制鍵的額外索引鍵的鍵盤按鍵輸入。
於大多數的用途標準
KeyUp、
KeyDown 和
KeyPress 事件人手夠多來擷取和處理按鍵。不過,不是所有的控制項引發所有的按鍵動作在所有情況下這些事件。
例如,考慮
DataGrid 控制項: 如果沒有資料已被指派到格線,箭號鍵 (向左鍵、 向、 向上鍵及向下鍵向右箭號) 引發
KeyUp 事件。例如 A 其他索引鍵] 或 [4,引發所有三個事件。如果
DataGrid 目前顯示的資料,沒有一個標準的鍵盤事件會引發瀏覽鍵。例如 A 按鍵或 4 不引發任何事件、 引發只
KeyUp,或引發所有的三個事件,視您在控制項中選取的是什麼。在這些情況下您可以依照本文擷取按鍵輸入無論控制項的狀態中。
本文的程式碼範例會寫入使用
DataGrid 因為
DataGrid 是最常要求這項功能是的控制項。您可以使用相同的方法與其他.NET 控制項。
設定索引鍵的設陷
若要設陷在 Windows Form 控制項中的按鍵動作,您必須衍生新類別,根據您想要的控制項的類別,並覆寫
ProcessCmdKey 方法。在這個覆寫的方法中,您將放入程式碼來處理按鍵輸入您想要進行補漏白。下列範例程式碼是這種類別的基本結構的範例:
class MyDataGrid : System.Windows.Forms.DataGrid
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
}
}
實作覆寫的方法
系統會將兩個參數傳遞到
ProcessCmdKey 方法:
訊息 和
keyData。
訊息 參數包含 Windows 訊息的例如 WM_KEYDOWN。
keyData 參數會包含已按下 [索引鍵的按鍵碼。如果也按 CTRL 鍵或 ALT 鍵,了
keyData 參數會包含 ModifierKey 資訊。
使用
訊息 參數不是強制性 ; 您可以忽略它。它是很好的作法不過,測試訊息。在本範例測試 WM_KEYDOWN 確認這是一個按鍵事件。您也測試 WM_SYSKEYDOWN,讓它能夠攔截包括 (主要是 ALT 鍵和 CTRL 鍵) 的控制項索引鍵的按鍵組合。
若要設陷特定的機碼,您可以評估 keyCode 藉由比較到
索引鍵 的列舉型別。下列程式碼範例會示範如何攔截按鍵向上鍵、 向下箭號、 TAB、 CTRL + M 和 ALT + Z:
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch(keyData)
{
case Keys.Down:
Console.WriteLine("Down Arrow Captured");
break;
case Keys.Up:
Console.WriteLine("Up Arrow Captured");
break;
case Keys.Tab:
Console.WriteLine("Tab Key Captured");
break;
case Keys.Control | Keys.M:
Console.WriteLine("<CTRL> + m Captured");
break;
case Keys.Alt | Keys.Z:
Console.WriteLine("<ALT> + z Captured");
break;
}
}
建置範例
下列範例顯示如何補漏白,
DataGrid 控制項的按鍵動作。
- 建立新的 Windows 控制項程式庫專案在 Visual C# 中。
- 檢視類別 UserControl1 的屬性並 MyDataGrid 來變更名稱。
- 「 控制項程式庫的檢視程式碼,然後變更下列程式碼
public class MyDataGrid : System.Windows.Forms.UserControl
下列:
public class MyDataGrid : System.Windows.Forms.DataGrid
Note In Visual Studio 2005 or Visual Studio 2008, change the following line of code: public partial class MyDataGrid : System.Windows.Forms.DataGrid
- 將下列方法加入至 MyDataGrid 類別:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch(keyData)
{
case Keys.Down:
this.Parent.Text="Down Arrow Captured";
break;
case Keys.Up:
this.Parent.Text="Up Arrow Captured";
break;
case Keys.Tab:
this.Parent.Text="Tab Key Captured";
break;
case Keys.Control | Keys.M:
this.Parent.Text="<CTRL> + M Captured";
break;
case Keys.Alt | Keys.Z:
this.Parent.Text="<ALT> + Z Captured";
break;
}
}
return base.ProcessCmdKey(ref msg,keyData);
}
- 建置專案。
- 建立新的 Windows 應用程式專案在 Visual C# 中。預設情況下,會建立名為 Form1 的表單。
- 按一下 [工具] 功能表的 [自訂工具箱
附註在 Visual Studio 2005] 或 [Visual Studio 2008 中按一下 [選擇工具箱項目]。 - 按一下 [.NET Framework 元件] 索引標籤。
- 按一下 [瀏覽、 尋找之控制項/DLL 剛建立,然後按一下 [確定]。
- 控制項 MyDataGrid 現在會顯示在工具箱中。放置一個在 Form1 注意: 您也可以在剩餘的步驟中使用程式碼,建立方格顯示的範例資料。
- 將下列程式碼加入至表單的命名空間。您可以在前] 或 [表單類別定義之後放置程式碼
// This structure is only used in providing sample data for the grid.
public struct gridData
{
private string make;
private int year;
public gridData(string n,int y)
{
make=n;
year=y;
}
public string Make
{
get{return make;}
set{make = value;}
}
public int Year
{
get{return year;}
set{year=value;}
}
}
- 將下列程式碼加入至表單類別緊接"Windows Form 設計工具產生的程式碼 」 一節:
protected gridData[] dataArray=new gridData[5];
- 將下列程式碼加入至 Form1 的 Load 事件:
// Create some sample data.
dataArray[0]=new gridData("ford",1999);
dataArray[1]=new gridData("chevrolet",1999);
dataArray[2]=new gridData("plymouth",1988);
dataArray[3]=new gridData("honda",1999);
dataArray[4]=new gridData("fiat",1987);
// Assign the data to the grid.
myDataGrid1.DataSource=dataArray;
- 執行這個範例,然後再試各種格式將補漏白 (向上鍵、 向下箭號、 TAB、 CTRL + M 和 ALT + Z) 被的按鍵動作。表單之標題更新以顯示哪一個按鍵被按下。