vb鍵盤攔截
我們知道,在一些程序中,有一些快捷方式(如:shift鍵最小化、esc鍵退出、ctrl+s存檔、alt+x退出等等)。以前有一些介紹使用win32api可以做到,但過於繁瑣,其實vb本身已經給我們提供了這個功能。
我們來新建一個窗體form1,對於鍵盤操作可以看到有三個事件keypress,keydown和keyup,下面我對它們分別介紹:
keypress事件是當用戶按下和鬆開一個ansi鍵時發生(ansi是可見ascii字元1-127)。
語法
privatesubobject_keypress([indexinteger,]keyasciiinteger)
keypress事件語法包含下列部分:
部分描述
object一個對象表達式,其值是「應用於」列表中的一個對象。
index一個整數,它用來唯一標識一個在控制項數組中的控制項(僅有控制項數組時才有)。
keyascii是返回一個標準數字ansi鍵代碼的整數。keyascii通過引用傳遞,對它進行改變可給對象
發送一個不同的字元。將keyascii改變為0時可取消擊鍵,這樣一來對象便接收不到字元。
說明
具有焦點的對象接收該事件。一個窗體僅在keypreview屬性被設置為true時才能接收該事件。一個keypress事件可以引用任何可列印的鍵盤字元,一個來自標準字母表的字元或少數幾個特殊字元之一的字元與ctrl鍵的組合,以及enter或backspace鍵。keypress事件過程在截取textbox或orgbobox控制項所輸入的擊鍵時是非常有用的。它可立即測試擊鍵的有效性或在字元輸入時對其進行格式處理。改變keyascii參數的值會改變所顯示的字元。
可使用下列表達式將keyascii參數轉變為一個字元:
chr(keyascii)
然後執行字元串操作,並將該字元反譯成一個控制項可通過該表達式解釋的ansi數字:
keyascii=asc(char)
在keypress處理不了的功能可以由keydown和keyup事件來處理:
語法
privatesubobject_keydown([indexinteger,]keycodeinteger,shiftinteger)
privatesubobject_keyup([indexinteger,]keycodeinteger,shiftinteger)
keydown和keyup事件包括下列部分:
部分描述
object一個對象表達式,其值是「應用於」列表中的一個對象。
index是一個整數,它用來唯一標識一個在控制項數組中的控制項(僅有控制項數組時才有)。
keycode是一個鍵代碼,諸如vbkeyf1(鍵)或vbkeyhome(home鍵)。
shift是在該事件發生時響應shift,ctrl和alt鍵的狀態的一個整數。shift、ctrl、alt鍵在這些位分別對應於值1、2和4。例如:如果ctrl和alt這兩個鍵都被按下,則shift的值為6。
說明
對於這兩個事件來說,帶焦點的對象都接收所有擊鍵。一個窗體只有在不具有可視的和有效的控制項時才可以獲得焦點。雖然keydown和keyup事件可應用於大多數鍵,它們最經常地還是應用於:擴展的字元鍵如功能鍵、定位鍵、鍵盤修飾鍵和按鍵的組合、區別數字小鍵盤和常規數字鍵;在需要對按下和鬆開一個鍵都響應時,可使用keydown和keyup事件過程。
下列情況不能引用keydown和keyup事件:窗體有一個orgmandbutton控制項,並且default屬性設置為true時的enter鍵。窗體有一個orgmandbutton控制項,並且cancel屬性設置為true時的esc鍵、tab鍵,keydown和keyup用兩種參數解釋每個字元的大寫形式和小寫形式:keycode—顯示物理的鍵(將a和a作為同一個鍵返回)和shift—顯示shift+key鍵的狀態而且返回a或a其中之一。
如果需要測試shift參數,可使用該參數中定義各位的shift常數。該常數有下列值:
常數值描述
vbshiftmask1hift鍵的位
屏蔽。
vbctrlmask2ctrl鍵的
位屏蔽。
vbaltmask4alt鍵的位
屏蔽。
該常數用作位屏蔽,它可被用來測試任何鍵組合。
注意:如果keypreview屬性被設置為true,則一個窗體先於該窗體上的控制項接收到此事件。可用keypreview屬性來創建全局鍵盤處理常式。
了解了以上知識,我們可以製作出非常完美而且帶有快捷鍵的程序,例如我們在一個程序中要用ctrl+s存檔,shift最小化,alt+x和esc退出:
首先啟動vb選擇新建exe文件,在form1窗體上拉一個textbox,並把form1的keypreview屬性設為true,雙擊form1,選擇form的keypress事件,輸入如下代碼:
privatesubform_keypress(keyasciiinteger)'esc鍵退出,vbescape可以用27代替
keyascii=vbescapethenend
endsub
在form的keydown事件中輸入如下代碼:
privatesubform_keydown(keycodeinteger,shiftinteger)'處理ctrl+x,shift,alt+x
shift=2andkeycode=vbkeysthenprint#filenum,bxwx.org'ctrl+s存檔,vbkeys=83
shift=bxwx.org=1'shift最小化
shift=4andkeycode=vbkeyxthenend'alt+x退出,vbkeyx=88
endsub
在form的load事件中輸入如下代碼:
privatesubform_load
dimfilenuminteger
filenum=freefilbxwx.org+「\bxwx.org"forappend#filenum
endsub
運行它就可以實現我們所要求的功能了,舉這個例子只是拋磚引玉的作用,利用它我們還可以編寫