淺析OnKeyPress事件和OnKeyDown/OnKeyUp事件

来源:互联网 发布:nodejs 数据接口开发 编辑:程序博客网 时间:2024/05/22 14:21

OnKeyPress事件
    OnKeyPress事件是在用戶按下鍵盤上任何一個可打印的字符時發生,只有能接收鍵盤輸入的組件才有OnKeyPress事件。我們常常利用OnKeyPress事件截取在編輯框和組合框組件中所輸入的擊鍵,還可以立即測試擊鍵的有效性或在字符輸入時對其進行一定的格式處理。
    例如,在TEdit組件上捕獲OnKeyPress事件,判斷輸入的是否是小寫字母,如果是,將其轉換為大寫字母,代碼如下:
    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    if (Key >= 'a' && Key <= 'z')
    {
       Key += 'A' - 'a';
    }
}
將Key的值改變為0時可取消擊鍵,這樣一來對象便接收不到字符,我們可以利用這個特點來屏蔽某些字符。例如,有時候我們只允許用戶輸入數字,則加入如下代碼:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    if (Key < '0' || Key > '9')
    {
        Key = 0;//取消剛才輸入的字符
    }
}
注意:OnKeyPress事件可以引用任何可打印的鍵盤字符,一個來自標準字母表的字符或少數幾個特殊字符之一的字符與CTRL 鍵的組合,以及ENTER 或BACKSPACE 鍵,但它並不能識別功能鍵( F1~F12),上下左右鍵,Shift鍵,Ctrl鍵以及Alt鍵等特殊控制鍵或者是組合鍵,要捕獲這些鍵可以採用OnKeyDown和OnKeyUp事件。
OnKeyDown/OnKeyUp事件
    當按下某個鍵不放時,產生OnKeyDown事件;釋放按鍵時,則產生OnKeyUp事件。雖然OnKeyDown 和OnKeyUp 事件可應用於大多數鍵,它們最經常地還是應用於擴展的字符鍵如功能鍵等,以彌補OnKeyPress事件的不足。
例如,TEdit組件的OnKeyDown/OnKeyUp事件過程框架如下:
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
    其中參數Key返回鍵盤的虛擬鍵碼。
    注意:OnKeyDown和OnKeyUp事件中的Key是Word型的,表示用戶按的是鍵盤上的哪個鍵,OnKeyPress中的Key是Char型,表示用戶輸入什麼字符。
    參數Shift提供事件發生時Shift,Ctrl和Alt鍵的狀態。Shift,Ctrl和Alt鍵的Shift值分別為ssShift,ssCtrl和ssAlt。例如,判斷Shift,Ctrl和Alt鍵是否被按下的代碼如下:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    String strInfo("您剛才按下了:\n複合鍵:");
    if (Shift.Contains(ssShift))
       strInfo += "Shift鍵";
    if (Shift.Contains(ssCtrl))
       strInfo += "Ctrl鍵";
    if (Shift.Contains(ssAlt))
       strInfo += "Alt鍵";
    strInfo += "\nASCII碼:";
    strInfo += IntToStr(Key);
    MessageBox(NULL, strInfo.c_str(), "信息提示", MB_OK);
}
注意:要讓某個對象產生OnKeyDown事件,OnKeyUp事件或OnKeyPress事件,先要讓該對象獲得控制權(即具有焦點),一個窗體僅在它沒有可視和有效的控件或KeyPreview 屬性被設置為True 時才能接收該事件。若在該對像上按住某個鍵再放開它,便會觸發上面三個事件。如果三個事件中均有操作,則其執行先後次序為:OnKeyDown事件先執行,OnKeyPress事件其次,OnKeyUp事件最後執行。
    OnKeyDown和OnKeyUp事件的事件處理過程中包含了最近一次擊鍵發生時,控制鍵Alt,Shift或者Ctrl是否按下的信息,而OnKeyPress事件只返回鍵的ASCII字符。
  假設用戶按下了Shift+P鍵,那麼這三種鍵盤事件產生的順序如下所示:
  (1)按下Shift鍵時將產生OnKeyDown事件。
  (2)保持Shift鍵再按下P時將產生OnKeyDown事件。
  (3)由於按下了P鍵,所以產生了OnKeyPress事件。
(4)釋放Shift鍵和P鍵,將產生OnKeyUp事件。
OnKeyPress 將每個字符的大、小寫形式作為不同的鍵代碼解釋,即作為兩種不同的字符。而OnKeyDown 和OnKeyUp 用兩個參數解釋每個字符的大寫形式和小寫形式:參數Key返回鍵盤的虛擬鍵碼,顯示物理的鍵(將A 和a 作為同一個鍵返回),參數Shift指示Shift鍵的狀態,從而返回A 或a 其中之一。
疑問:如何判斷同時按下Shift,Ctrl和Alt鍵?
補充:虛擬鍵碼
大多數虛擬鍵碼的名稱在WINUSER.H表頭檔案中都定義為以VK_開頭。下表列出了這些名稱和數值(十進制和十六進制),以及與虛擬鍵相對應的IBM相容機種鍵盤上的鍵。
前四個虛擬鍵碼中有三個指的是滑鼠鍵,您永遠都不會從鍵盤訊息中獲得這些滑鼠鍵代碼,但我們能夠從滑鼠訊息中獲得它們。VK_CANCEL代碼是一個虛擬鍵碼,它包括同時按下兩個鍵(Ctrl-Break)。Windows應用程式通常不使用此鍵。
Windows也包括在主鍵盤上的字母和數字鍵的虛擬鍵碼,A 鍵到Z 鍵與其ASCII 碼的相應值'A' 到'Z' 是一致的,0鍵到9 鍵與其ASCII 碼的相應值'0' 到'9' 是一致的。
96~111代表數字小鍵盤上的鍵。
雖然多數的鍵盤都有12個功能鍵,但Windows只需要10個,而位元旗標卻有24個。
十進位十六進位虛擬鍵碼IBM相容鍵盤
1 01 VK_LBUTTON 滑鼠左鍵
2 02 VK_RBUTTON 滑鼠右鍵
3 03 VK_CANCEL Ctrl-Break
4 04 VK_MBUTTON 滑鼠中鍵
8 08 VK_BACK Backspace
9 09 VK_TAB Tab
12 0C VK_CLEAR CLEAR 鍵,Num Lock關閉時的數字鍵盤5
13 0D VK_RETURN Enter
16 10 VK_SHIFT Shift
17 11 VK_CONTROL Ctrl
18 12 VK_MENU Alt
19 13 VK_PAUSE Pause
20 14 VK_CAPITAL Caps Lock
27 1B VK_ESCAPE Esc
32 20 VK_SPACE Spacebar
33 21 VK_PRIOR Page Up
34 22 VK_NEXT Page Down
35 23 VK_END End
36 24 VK_HOME Home
37 25 VK_LEFT 左箭頭
38 26 VK_UP 上箭頭
39 27 VK_RIGHT 右箭頭
40 28 VK_DOWN 下箭頭
41 29 VK_SELECT SELECT 鍵
42 2A VK_PRINT PRINT SCREEN 鍵
43 2B VK_EXECUTE EXECUTE 鍵
44 2C VK_SNAPSHOT SNAP SHOT 鍵
45 2D VK_INSERT Insert鍵
46 2E VK_DELETE Delete鍵
47 2F VK_HELP HELP 鍵
48-57 30-39 無 主鍵盤上的0到9
65-90 41-5A 無 A到Z
91 5B VK_LWIN 左Windows鍵
92 5C VK_RWIN 右Windows鍵
93 5D VK_APPS Applications鍵
96-105 60-69 VK_NUMPAD0到VK_NUMPAD9NumLock打開時數字鍵盤上的0到9
106 6A VK_MULTIPLY 數字鍵盤上的*
107 6B VK_ADD 數字鍵盤上的+
108 6C VK_SEPARATOR數字鍵盤上的ENTER 鍵
109 6D VK_SUBTRACT 數字鍵盤上的-
110 6E VK_DECIMAL 數字鍵盤上的.
111 6F VK_DIVIDE 數字鍵盤上的/
112-121 70-79 VK_F1到VK_F10 功能鍵F1到F10
122-135 7A-87 VK_F11到VK_F24功能鍵F11到F24
144 90 VK_NUMLOCK Num Lock
145 91 VK_SCROLL Scroll Lock

文章出處 : 点击打开链接

原创粉丝点击