用VB編寫(xiě)鍵盤(pán)攔截程序
2024-09-07 17:32:50
供稿:網(wǎng)友
我們知道,在一些程序中,有一些快捷方式(如:Shift鍵最小化、ESC鍵退出、Ctrl+S存盤(pán)、Alt+x退出等等)。以前有一些介紹使用Win32 API可以做到,但過(guò)于繁瑣,其實(shí)VB本身已經(jīng)給我們提供了這個(gè)功能。
我們來(lái)新建一個(gè)窗體Form1,對(duì)于鍵盤(pán)操作可以看到有三個(gè)事件KeyPress(),KeyDown和KeyUp,下面我對(duì)它們分別介紹:
KeyPress()事件是當(dāng)用戶(hù)按下和松開(kāi)一個(gè)ANSI鍵時(shí)發(fā)生(ANSI是可見(jiàn)ASCII字符1-127)。
語(yǔ)法 Private Sub object_KeyPress([index As Integer,]keyascii As Integer) KeyPress事件語(yǔ)法包含下列部分:
部分描述
object一個(gè)對(duì)象表達(dá)式,其值是"應(yīng)用于"列表中的一個(gè)對(duì)象。
index一個(gè)整數(shù),它用來(lái)唯一標(biāo)識(shí)一個(gè)在控件數(shù)組中的控件(僅有控件數(shù)組時(shí)才有)。
keyascii是返回一個(gè)標(biāo)準(zhǔn)數(shù)字ANSI鍵代碼的整數(shù)。Keyascii通過(guò)引用傳遞,對(duì)它進(jìn)行改變可給對(duì)象。
發(fā)送一個(gè)不同的字符。將keyascii改變?yōu)?時(shí)可取消擊鍵,這樣一來(lái)對(duì)象便接收不到字符。
說(shuō)明
具有焦點(diǎn)的對(duì)象接收該事件。一個(gè)窗體僅在KeyPreview屬性被設(shè)置為T(mén)rue時(shí)才能接收該事件。一個(gè)KeyPress事件可以引用任何可打印的鍵盤(pán)字符,一個(gè)來(lái)自標(biāo)準(zhǔn)字母表的字符或少數(shù)幾個(gè)特殊字符之一的字符與CTRL鍵的組合,以及ENTER或BACKSPACE鍵。KeyPress()事件過(guò)程在截取TextBox或ComboBox控件所輸入的擊鍵時(shí)是非常有用的。它可立即測(cè)試擊鍵的有效性或在字符輸入時(shí)對(duì)其進(jìn)行格式處理。改變keyascii參數(shù)的值會(huì)改變所顯示的字符。
可使用下列表達(dá)式將keyascii參數(shù)轉(zhuǎn)變?yōu)橐粋€(gè)字符: Chr(KeyAscii) 然后執(zhí)行字符串操作,并將該字符反譯成一個(gè)控件可通過(guò)該表達(dá)式解釋的ANSI數(shù)字: KeyAscii = Asc(char) 在KeyPress()處理不了的功能可以由KeyDown()和KeyUp()事件來(lái)處理: 語(yǔ)法 Private Sub object_KeyDown([index As Integer,]keycode As Integer, shift As Integer) Private Sub object_KeyUp([index As Integer,]keycode As Integer, shift As Integer) KeyDown和KeyUp事件包括下列部分: 部分描述 object一個(gè)對(duì)象表達(dá)式,其值是"應(yīng)用于"列表中的一個(gè)對(duì)象。 index是一個(gè)整數(shù),它用來(lái)唯一標(biāo)識(shí)一個(gè)在控件數(shù)組中的控件(僅有控件數(shù)組時(shí)才有)。 keycode是一個(gè)鍵代碼,諸如vbKeyF1(F1鍵)或vbKeyHome(HOME鍵)。 shift是在該事件發(fā)生時(shí)響應(yīng)SHIFT ,CTRL和ALT鍵的狀態(tài)的一個(gè)整數(shù)。shift、CTRL、ALT鍵在這些位分別對(duì)應(yīng)于值1、2和4。例如:如果CTRL和ALT這兩個(gè)鍵都被按下,則shift的值為6。
說(shuō)明
對(duì)于這兩個(gè)事件來(lái)說(shuō),帶焦點(diǎn)的對(duì)象都接收所有擊鍵。一個(gè)窗體只有在不具有可視的和有效的控件時(shí)才可以獲得焦點(diǎn)。雖然KeyDown()和KeyUp()事件可應(yīng)用于大多數(shù)鍵,它們最經(jīng)常地還是應(yīng)用于:擴(kuò)展的字符鍵如功能鍵、定位鍵、鍵盤(pán)修飾鍵和按鍵的組合、區(qū)別數(shù)字小鍵盤(pán)和常規(guī)數(shù)字鍵;在需要對(duì)按下和松開(kāi)一個(gè)鍵都響應(yīng)時(shí),可使用KeyDown和KeyUp事件過(guò)程。
下列情況不能引用KeyDown和KeyUp事件:窗體有一個(gè)CommandButton控件,并且Default屬性設(shè)置為T(mén)rue時(shí)的ENTER鍵。窗體有一個(gè)CommandButton控件,并且Cancel屬性設(shè)置為T(mén)rue時(shí)的ESC鍵、TAB鍵,KeyDown和KeyUp用兩種參數(shù)解釋每個(gè)字符的大寫(xiě)形式和小寫(xiě)形式:keycode-顯示物理的鍵(將A和a作為同一個(gè)鍵返回)和shift-顯示shift+key鍵的狀態(tài)而且返回A或a其中之一。
如果需要測(cè)試shift參數(shù),可使用該參數(shù)中定義各位的shift常數(shù)。該常數(shù)有下列值:
常數(shù)值描述
vbShiftMask 1 HIFT鍵的位
屏蔽。
VbCtrlMask 2 CTRL鍵的
位屏蔽。
VbAltMask 4 ALT鍵的位
屏蔽。
該常數(shù)用作位屏蔽,它可被用來(lái)測(cè)試任何鍵組合。
注意:如果KeyPreview屬性被設(shè)置為T(mén)rue,則一個(gè)窗體先于該窗體上的控件接收到此事件。可用KeyPreview屬性來(lái)創(chuàng)建全局鍵盤(pán)處理例程。
了解了以上知識(shí),我們可以制作出非常完美而且?guī)в锌旖萱I的程序,例如我們?cè)谝粋€(gè)程序中要用Ctrl+S存盤(pán),Shift最小化,Alt+X和ESC退出:
首先啟動(dòng)vb選擇新建EXE文件,在Form1窗體上拉一個(gè)TextBox,并把Form1的KeyPreview屬性設(shè)為T(mén)rue,雙擊Form1,選擇Form的KeyPress事件,輸入如下代碼: Private Sub Form_KeyPress(KeyAscii as Integer) 'Esc鍵退出,VbEscape可以用27代替 If KeyAscii=VbEscape then End End Sub 在Form的KeyDown事件中輸入如下代碼: Private Sub Form_KeyDown(KeyCode as Integer,Shift as Integer) '處理Ctrl+X,Shift,Alt+X If Shift=2 And KeyCode=VbKeyS Then Print#FileNum,Form1.Text1.Text 'Ctrl+S存盤(pán),VbKeyS=83 If shift=2 then Form1.WindowState=1 'Shift最小化 If Shift=4 And KeyCode=VbKeyX Then End 'Alt+X退出,VbkeyX=88 End Sub 在Form的Load事件中輸入如下代碼: Private Sub Form_load() Dim FileNum as integer FileNum=FreeFile Open App.Path+"Sample.txt" For Append As#FileNum End Sub