C#鍵盤事件處理


如果你希望用戶按F1彈出chm幫助,代碼如下:

復制代碼
private void FrmMain_Load(object sender, EventArgs e)
{
    this.KeyPreview = true;//獲取或設置一個值,該值指示在將鍵事件傳遞到具有焦點的控件前,窗體是否將接收此鍵事件。
}

private void FrmMain_KeyUp(object sender, KeyEventArgs e)
{
    if (Keys.F1 == e.KeyCode)
    {
        //MessageBox.Show("您所按動的鍵是:" + e.KeyCode.ToString());
        Help.ShowHelp(this,@"C:\Users\HongYe\Desktop\RevitAPI.chm");
    }
}
復制代碼

鍵盤事件是在用戶按下鍵盤上的一個鍵的時候發生的,可分為兩類。第一類是KeyPress事件,當按下的鍵表示的是一個ASCII字符的時候就會觸發這類事件,可通過他的KeyPressEventArgs類型參數的屬性KeyChar來確定按下的鍵的ASCII。使用KeyPress時間無法判斷是否按下了修改鍵(Shift,Alt和Ctrl),為了判斷這些動作,就要處理KeyUp 或KeyDown事件,這些時間組成了第二類事件。該類事件有一個KeyEventsArgs類型參數,通過該參數可以測試是否按下了一些修改鍵。

1.       KeyPressEventArgs類的主屬性(KeyPress事件的一個參數類型)
(1).Handle屬性:用來獲取或設置一個值,該值指示是否處理過KeyPress事件。
(2).KeyChar屬性:用來獲取按下的鍵對應的字符,通常是該鍵的ASCII瑪(返回的是鍵盤的值,如按‘K‘返回就是K)。

2.KeyEventArgs類的主屬性(KeyUp和KeyDown事件的一個參數)
(1).Alt屬性:用來獲取一個值,該值提示是否曾按下了Alt鍵
(2).Control屬性:用來獲取一個值,該值提示是否曾按下了Crtl鍵
(3).Shift屬性:用來獲取一個值,該值提示是否曾按下了Shift鍵
(4).Handle屬性:用來獲取一個值,該值提示是否曾處理過此事件
(5).KeyCode屬性:以Keys枚舉值返回鍵盤鍵的鍵碼,該屬性不包含修改鍵信息,用於測試指定的鍵盤鍵
(6).KeyData屬性:以Keys枚舉值返回鍵盤鍵的鍵碼,該屬性包含修改鍵信息,用於判斷按下鍵的所有信息(可返回組合鍵)
(7).KeyValue屬性:以整數形式返回鍵碼,而不是Keys枚舉類型值。用於獲得所按下鍵的數字表示
(8).Modifiers屬性:以Keys枚舉值返回所按下的修改鍵,僅判斷修改鍵的信息

3.如何在C#程序中定義這些事件:
  C#中描述"KeyDown"、"KeyUp"的事件的Delegate是"KeyEventHandler"。而描述"KeyPress"所用的Delegate是"KeyPressEventHandler"。這二個Delegate都被封裝在命名空"Syetem.Windows.Froms"中。為"KeyDown"、"KeyUp"的事件提供數據的類是"KeyEventArgs"。而為"KeyPress"事件提供數據的類是"KeyPressEventArgs"。同樣這二者也被封裝在命名空間"Syetem.Windows.Froms"中。

  在C#程序定義"KeyDown"、"KeyUp"事件的語法如下:
"組件名稱"."事件名稱"+= new Syetem.Windows.Froms. KeyEventHandler("事件名稱");

  下面是程序中具體實現代碼:
button1. KeyUp += new Syetem.Windows.Froms. KeyEventHandler(button1_KUp);

  下面是響應上面事件的基本結構。
private void button1_KUp ( object sender , Syetem.Windows.Froms. KeyEventArgs e )
{
此處加入響應此事件的代碼
}

  在C#程序定義"KeyPress"事件的語法如下:
"組件名稱"."事件名稱"+= new Syetem.Windows.Froms. KeyPressEventHandler("事件名稱");

  下面是程序中具體實現代碼:
button1. KeyPress += new Syetem.Windows.Froms. KeyPressEventArgs(button1_KPress);

  在完成了事件的定義以后,就要在程序中加入響應此事件的代碼,否則程序編譯的時候會報錯。下面是響應上面事件的基本結構。
private void button1_KPress ( object sender , Syetem.Windows.Froms. KeyPressEventArgs e )
{
此處加入響應此事件的代碼

注釋:程序中出現的"button1"是定義的一個按鈕組件。

例子:
   private void Form1_KeyUp(object sender, KeyEventArgs e)
   {
    MessageBox.Show("您所按動的鍵是:"+e.KeyCode.ToString());
   }

 

C# 中 KeyPress 、KeyDown 和KeyPress的詳細區別[轉]

 

最近在做一個程序,需要實現窗口下的F5 刷新功能。

研究了一下KeyDown,KeyPress 和KeyUp ,發現之間還是有點學問的。

讓我們帶着如下問題來說明,如果你看到這些問題你都知道,那么這篇文章你就當復習吧:)

1.這三個事件的順序是怎么樣的?

2.KeyDown 觸發后,KeyUp是不是一定觸發?

3.三個事件的定義

4.KeyDown、KeyUp 和KeyPress 之間的區別

5.如何區分是否按的是小鍵盤?

6.PrScrn按鍵三個事件能夠捕獲嗎?

7.{菜單鍵}和{開始鍵}KeyPress能夠捕獲嗎?

8.如何捕獲系統的組合鍵?

9.通過什么方式捕獲PrScrn按鍵事件?

(一)鍵事件按下列順序發生: 

  1. KeyDown

  2. KeyPress

  3. KeyUp

 (二)KeyDown觸發后,不一定觸發KeyUp,當KeyDown 按下后,拖動鼠標,那么將不會觸發KeyUp事件。

 (三)定義

KeyDown:在控件有焦點的情況下按下鍵時發生。

KeyPress:在控件有焦點的情況下按下鍵時發生。(下面會說和KeyDown 的區別)

KeyUp:在控件有焦點的情況下釋放鍵時發生。

 (四)KeyPress 和KeyDown 、KeyPress之間的區別

          1.KeyPress主要用來捕獲數字(注意:包括Shift+數字的符號)、字母(注意:包括大小寫)、小鍵盤等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜單鍵}、{開始鍵}和方向鍵外的ANSI字符
             KeyDown 和KeyUp 通常可以捕獲鍵盤除了PrScrn所有按鍵(這里不討論特殊鍵盤的特殊鍵)

           2.KeyPress 只能捕獲單個字符

               KeyDown 和KeyUp 可以捕獲組合鍵。

          3.KeyPress 可以捕獲單個字符的大小寫

          4.KeyDown和KeyUp 對於單個字符捕獲的KeyValue 都是一個值,也就是不能判斷單個字符的大小寫。

          5.KeyPress 不區分小鍵盤和主鍵盤的數字字符。

               KeyDown 和KeyUp 區分小鍵盤和主鍵盤的數字字符。

          6.其中PrScrn 按鍵KeyPress、KeyDown和KeyUp 都不能捕獲。

 (五)系統組合鍵的判定

在使用鍵盤的時候,通常會使用到CTRL+SHIFT+ALT 類似的組合鍵功能。對於此,我們如何來判定?

     通過KeyUp 事件能夠來處理(這里說明一下為什么不用KeyDown,因為在判定KeyDown的時候,CTRL、SHIFT和ALT 屬於一直按下狀態,然后再加另外一個鍵是不能准確捕獲組合鍵,所以使用KeyDown 是不能准確判斷出的,要通過KeyUp 事件來判定 )

     這里簡單的列舉出CTRL+其它鍵的組合判定代碼:

復制代碼
private void Form3_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Control)
            {
                MessageBox.Show("KeyUp:Ctrl+" + e.KeyValue.ToString());
            }
        }
復制代碼

 

 

 (六)捕獲PrScrn按鍵事件

 通過一種鈎子的方式可以判定PrScrn 按鍵事件,鈎子可以獲取任何鍵盤事件。

C#_e.Handled用法

如果你希望用戶按F1彈出chm幫助,代碼如下:

復制代碼
private void textBoxSize_KeyPress(object sender, KeyPressEventArgs e)

    {
      // Remove all characters that are not numbers, backspace, or enter.
      if ((e.KeyChar < 48 || e.KeyChar > 57) &&
                                             e.KeyChar != 8 && e.KeyChar != 13)
      {
        e.Handled = true;
      }
      else if (e.KeyChar == 13)
      {
        // Apply size if the user hits enter
        TextBox txt = (TextBox)sender;

        if (txt.Text.Length > 0)
          ApplyTextSize(txt.Text);
        e.Handled = true;
        this.richTextBoxText.Focus();
      }
    }

 
復制代碼

   

總結:Handled     獲取或設置一個值,該值指示是否處理過KeyPress 事件  
           e.Handled = false的時候表示可以接受該事件  

           e.Handled = true時表示已經處理了事件(即不處理當前鍵盤事件)

           KeyChar     獲取或設置與按下的鍵對應的字符

 

 MSDN幫助 https://msdn.microsoft.com/zh-cn/library/system.windows.forms.keypresseventargs.keychar.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

 

復制代碼
using System;
using System.Windows.Forms;

public class Form1: Form
{
    public Form1()
    {
        // Create a TextBox control.
        TextBox tb = new TextBox();
        this.Controls.Add(tb);
        tb.KeyPress += new KeyPressEventHandler(keypressed);
    }

    private void keypressed(Object o, KeyPressEventArgs e)
    {
        // The keypressed method uses the KeyChar property to check 
        // whether the ENTER key is pressed. 

        // If the ENTER key is pressed, the Handled property is set to true, 
        // to indicate the event is handled.
        if (e.KeyChar == (char)Keys.Return)
        {
            e.Handled = true;
        }
    }

    public static void Main()
    {
        Application.Run(new Form1());
    }
}
 
 
復制代碼

 資源來源與網絡:https://www.cnblogs.com/lhyqzx/p/5955440.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM