文章編號: 320584 - 上次校閱: 2006年12月11日 - 版次: 2.4

如何藉由使用 Visual C# 截取按鍵輸入控制項中

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步告訴您,如何補漏白的 Windows Form 控制項的按鍵動作。本文使用範例程式碼,您可以攔截幾乎任何個別的按鍵動作。您也可以攔截包括 CTRL 和 ALT 的按鍵組合。這項技術不會擷取列印螢幕索引鍵。此外,可能無法擷取從使用例如網頁瀏覽器或 CD-ROM 玩家控制鍵的額外索引鍵的鍵盤按鍵輸入。

於大多數的用途標準 KeyUpKeyDownKeyPress 事件人手夠多來擷取和處理按鍵。不過,不是所有的控制項引發所有的按鍵動作在所有情況下這些事件。

例如,考慮 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 控制項的按鍵動作。
  1. 建立新的 Windows 控制項程式庫專案在 Visual C# 中。
  2. 檢視類別 UserControl1 的屬性並 MyDataGrid 來變更名稱。
  3. 「 控制項程式庫的檢視程式碼,然後變更下列程式碼
    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 
  4. 將下列方法加入至 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);
    }
    					
  5. 建置專案。
  6. 建立新的 Windows 應用程式專案在 Visual C# 中。預設情況下,會建立名為 Form1 的表單。
  7. 按一下 [工具] 功能表的 [自訂工具箱

    附註在 Visual Studio 2005] 或 [Visual Studio 2008 中按一下 [選擇工具箱項目]。
  8. 按一下 [.NET Framework 元件] 索引標籤。
  9. 按一下 [瀏覽、 尋找之控制項/DLL 剛建立,然後按一下 [確定]
  10. 控制項 MyDataGrid 現在會顯示在工具箱中。放置一個在 Form1 注意: 您也可以在剩餘的步驟中使用程式碼,建立方格顯示的範例資料。

  11. 將下列程式碼加入至表單的命名空間。您可以在前] 或 [表單類別定義之後放置程式碼
    // 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;}
       }
    }
    					
  12. 將下列程式碼加入至表單類別緊接"Windows Form 設計工具產生的程式碼 」 一節:
    protected gridData[] dataArray=new gridData[5];
    					
  13. 將下列程式碼加入至 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;
    					
  14. 執行這個範例,然後再試各種格式將補漏白 (向上鍵、 向下箭號、 TAB、 CTRL + M 和 ALT + Z) 被的按鍵動作。表單之標題更新以顯示哪一個按鍵被按下。

這篇文章中的資訊適用於:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
關鍵字:?
kbmt kbhowtomaster KB320584 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:320584? (http://support.microsoft.com/kb/320584/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。