在應用程序中,有時需要用戶錄入一些不宜在屏幕上直接顯示的內容,如用戶口令或機密數據。我們已熟知,在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