我們在使用Windows時,經常會碰到一些密碼編輯框,輸入其中的文字都以“*”顯示。現在,有許多共享軟件和自由軟件都可以實現隱藏密碼的正確顯示。究竟這是怎樣實現的呢!其實,這比較簡單,雖然這些信息都以“*”顯示,但其內部還是以當初的字符表示,所以,我們只要用Windows API函數就可以實現。
在Windows中,每一個窗口、控件都有它的名字(叫做Name或Window Text)。對於Form、Dialog Box、Message Box來說,名字就顯示在Title Bar中;對於Edit、Button、Static Control,名字顯示在他所占的區域中。密碼編輯框本身就是個Edit控件,雖然顯示的是特殊字符,但名字屬性沒有變,還是輸入時的字符。Windows提供了兩個API函數來獲得這個名字:
int GetWindowTextLength(HWND hWnd); // 得到名字的長度
其中,hWnd :想要得到的那個窗口或控件的句柄 handle
int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount );// 得到名字
其中,hWnd :想要得到的那個窗口或控件的句柄 handle;
lpString:存放名字的字符串的地址
nMaxCount :可拷貝的最大字符數
下面以Delphi為例,說明它的實現過程。
新建一Form,放置Label、Edit、Button各一個到Form中,將Edit1的PassWordChar屬性改為“*”,雙擊Button1:
var
Name:PChar; // 名字
L:integer; // 名字的長度
begin
L:=GetWindowTextLength(Edit1.handle)+1; // 得到名字長度,並將長度加1
GetMem(Name,L);//為將要得到的名字分配內存
GetWindowText(Edit1.handle,Name,L);//得到名字
label1.Caption:=String(Name); // 將得到的名字顯示於 Label1
FreeMem(Name,0); // 釋放分配的內存
end;
經過運行,在Edit1中輸入的密碼就可通過Label1顯示出來。