top
Loading...
如何在VB中制作不回顯的文本框
p> 在應用程序中,有時需要用戶錄入一些不宜在屏幕上直接顯示的內容,如用戶口令或機密數據。我們已熟知,在Foxbase/Foxpro中這一功能可以用SETCONSOLEOFF命令關閉向屏幕的回顯來實現。那么,在VisualBasicforWin-dows中如何做到這一點呢?

一個容易想到的方法是利用文本框的Key-Press事件,但為了處理用戶對文字的編輯(如刪除、插入),則還要再用其它變量存放真正輸入的內容,而且必須書寫大量復雜的控制程序。實踐證明,這種方法比較繁瑣,不便使用。

筆者在用VB編程時發現,Windows文本框可以響應許多消息,那么,可不可以利用WindowsAPI函數sendmessage將控制特性的消息傳遞給文本框呢?如果可行,則可以將使目標以密碼形式輸出的消息傳遞給文本框,不就可以制作出不回顯文字的文本框了嗎?

答案是肯定的。筆者使用以上思路實現了這一功能。以下是程序中用到的幾個API函數和有關的消息:


getfocus():返回獲得輸入焦點的目標句柄;
getwindowlong():取得指定目標的信息,第二個參數為GWL_STYLE時將返回目標的“風格”屬性;
setwindowlong():把新的屬性值賦予指定的目標。該函數的三個參數分別為目標的句柄、屬性類型、新屬性值;
sendmessage():向目標發送一條消息。該函數的四個參數分別為接收消息的目標句柄、消息、消息參數一、消息參數二;
GWL_STYLE(程序中簡寫為STYLE):其值為-16,表示目標的“風格”;
ES_PASSWORD(程序中簡寫為PASS)簡寫為PASS):其值為&H20,表示目標具有錄入口令的屬性,即在錄入時不回顯;
EM_SETPASSWORDCHAR(程序中簡寫為PASSCHAR):其值為&H41C,表示傳遞密碼特性。用sendmessage向目標傳遞此消息成功,則目標會將自身的輸出信息以指定的密碼形式給出。


以下程序,通過sendmessage函數修改文本框Text1的“風格”屬性,使其以指定的密碼形式輸出———不管用戶錄入的是什么內容,都以相同數量的“*”來顯示。用戶可以通過單點“Command1”按鈕來顯示Text1.Text的真正內容。

DeclareFunctiongetfocusLib“user”()AsInteger
DeclareFunctiongetwindowlongLib“user”(ByValhandAsInteger,ByValind
ex AsInte-ger)AsLong
DeclareFunctionsetwindowlongLib“user”(ByValhandAsInteger,ByValind
ex AsInte-ger,ByValnewflagAsLong)AsLong
De reFunctionsendmessageLib“user”(ByValhandAsInteger,ByValmsgAs
Integer,ByValwparaAsInteger,ByVallparaAsLong)AsLong
ConstSTYLE=-16
ConstPASS=&H20
ConstPASSCHAR=&H41C
SubCommand1_Click()
MsgBoxtext1.Text
EndSub
SubCommand2_Click()
End
EndSub
SubForm_Load()
Show
text1.SetFocus
hand%=getfocus()
flag&=getwindowlong(hand%,STYLE)OrPASS
flag&=setwindowlong(hand%,STYLE,flag&)
flag&=sendmessage(hand%,PASS-CHAR,Asc(“*”),0&)
EndSub



作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗