??
字號(hào):
您的位置→首頁(yè)→編程技巧→第十二期→[上一期|下一期]
讓密碼輕松顯示 [返回]
你夢(mèng)想的密碼顯示程序是什么樣子呢?不需要兩個(gè)窗口之間的切換,不需要圖標(biāo)拖來(lái)拖去,只需要移動(dòng)鼠標(biāo)到密碼框上,密碼就會(huì)自動(dòng)顯示出來(lái)。真的有那么神奇嗎?嗯哼,跟著我做吧。
首先,新建一個(gè)工程,然而建立一個(gè)公共模塊,把以下代碼貼入其中:
Declare Function SendMessage Lib “user32" Alias “SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function IsWindow Lib “user32" (ByVal hwnd As Long) As Long
Declare Function GetCursorPos Lib “user32" (lpPoint As POINTAPI) As Long
Declare Function WindowFromPoint Lib“user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Declare Function InvalidateRect Lib “user32" (ByVal hwnd As Long, lpRect As Any, ByVal bErase As Long) As Long
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Type POINTAPI
x As Long
y As Long
End Type
Public Const WM_PAINT = &HF
Public Const EM_SETPASSWORDCHAR = &HCC
Public Const WM_ERASEBKGND = &H14
你可以使用API文本查看器來(lái)助你一臂動(dòng),但一定要注意InvalidateRect函數(shù)中的lpRect參數(shù)類(lèi)型應(yīng)為Any,而不是Rect類(lèi)型,否則……,呵呵,你試試就知道了。
接下來(lái),在窗體上放置一個(gè)timer控件,把它的interval屬性設(shè)為1000,也就是每秒一次。然后雙擊它,寫(xiě)入以下代碼:
Private Sub Timer1_Timer()
Dim hwnd As Long
Dim WndIs As Long
Dim temp As Long
Dim CurrentP As POINTAPI
temp = GetCursorPos(CurrentP)
hwnd = WindowFromPoint(CurrentP.x, CurrentP.y)
WndIs = IsWindow(hwnd)
If WndIs <> 0 Then
temp = SendMessage(hwnd, EM_SETPASSWORDCHAR, 0, 0)
temp = InvalidateRect(0, 0, 1)
End If
End Sub
OK,運(yùn)行它。可是,這窗體上什么也沒(méi)有,那么怎樣才能顯示密碼?別急,這個(gè)窗體沒(méi)有用了,你可以最小化它,然后打開(kāi)密碼程序,例如“撥號(hào)網(wǎng)絡(luò)",把鼠標(biāo)移動(dòng)到它的“*”上面,然后……,怎樣?揉一揉眼睛,沒(méi)錯(cuò)吧!
奧秘在哪兒呢?這個(gè)程序向你露出龐大的Windows消息系統(tǒng)的冰山一角,顯示出一些鮮為人知的Windows系統(tǒng)的秘密。
眾多的VB用戶(hù)都知道,Windows程序是基于消息驅(qū)動(dòng)的進(jìn)程。每一個(gè)程序都調(diào)用了大量的外部模塊,很多模塊程序代碼位于DLL庫(kù)和ActiveX庫(kù)中,各種模塊通信的過(guò)程就是消息響應(yīng)的過(guò)程。文本編輯控件可設(shè)置成PassWorChar屬性,即成為密碼框,它同樣需要響應(yīng)其它消息才能與其它模塊進(jìn)行通訊,比如,它響應(yīng)——消息,你就可以利用GetWindowText函數(shù)取得它的內(nèi)容(這就是上一個(gè)密碼程序的原理呀)。同樣,它響應(yīng)EM_SETPASSWORDCHAR消息就可以把它由密碼狀態(tài)還原為初始狀態(tài),然后你必須再發(fā)送WM_PAINT消息來(lái)刷新它,才能完全顯示出來(lái)。怎樣,簡(jiǎn)單吧。拋磚引玉,你還可以發(fā)送其它消息來(lái)達(dá)到其它的效果。
用VB構(gòu)建Internet的應(yīng)用 [返回]
Internet技術(shù)的發(fā)展為編程人員提供了更廣泛的施展身手的空間。早先"Internet應(yīng)用程序"這個(gè)詞僅僅只是指一些用FTP協(xié)議下載文件或?yàn)g覽HTML頁(yè)面的工具,而如今使用Visual Basic,不僅可以為Internet開(kāi)發(fā)應(yīng)用程序,而且還可以把Internet技術(shù)作為一部分融入大型的解決方案中。
今天我們所要討論的問(wèn)題是利用Visual Basic創(chuàng)建在面向Internet的應(yīng)用中起重要作用的ActiveX組件。例如,你所創(chuàng)建的ActiveX控件可以用于HTML頁(yè)面;你開(kāi)發(fā)的ActiveX文檔可以在Internet瀏覽器中使用并于其他的組件一起和HTML頁(yè)面集成起來(lái);另外ActiveX代碼組件(以前被稱(chēng)為OLE服務(wù)器), 可以被部署在客戶(hù)端或服務(wù)器端的計(jì)算機(jī)上用于后臺(tái)的處理。
[Internet的開(kāi)發(fā)環(huán)境]
Internet是一個(gè)使用TCP/IP協(xié)議、全球性的非集中管理的計(jì)算機(jī)網(wǎng)絡(luò)。如果去掉全球性這一點(diǎn), 所謂"Internet技術(shù)"完全可以和本地局域網(wǎng)中所使用的技術(shù)一樣。
從一方面來(lái)看, Internet技術(shù)只是簡(jiǎn)單地為開(kāi)發(fā)人員提供了另一個(gè)施展身手的空間。如果你在和Web連接時(shí)使用了ActiveX組件,盡管你具體實(shí)現(xiàn)的方法有可能不同,如采用了HTML和VBScript代碼以實(shí)現(xiàn)安全性或是其他,但是你仍然在調(diào)用方法,設(shè)置屬性,處理事件等等。這樣,作為一個(gè)VB開(kāi)發(fā)人員所有的知識(shí)和技能都被用于了Internet的環(huán)境下。
從另外一個(gè)方面來(lái)看,應(yīng)用Internet的技術(shù)可以使你向一些吸引人的方向延伸你的開(kāi)發(fā)工作。例如將ActiveX組件和Internet技術(shù)綜合有以下的益處:
更簡(jiǎn)單的維護(hù)---作為Web一部分的組件可以根據(jù)需要下載,無(wú)須用戶(hù)運(yùn)行一個(gè)setup程序進(jìn)行升級(jí);
將功能延伸至Internet---通過(guò)通用協(xié)議,用戶(hù)將看不見(jiàn)在Internet和Intranet之間的切換。
Internet客戶(hù)/服務(wù)器
可以借用客戶(hù)機(jī)/服務(wù)器的關(guān)系來(lái)考查Internet的開(kāi)發(fā)環(huán)境,客戶(hù)端和服務(wù)器端都可以有"靜態(tài)的"和"活動(dòng)的"兩種狀態(tài)。活動(dòng)的客戶(hù)機(jī)或服務(wù)器可以根據(jù)其內(nèi)部狀態(tài)的改變而動(dòng)態(tài)地運(yùn)行一個(gè)腳本或是改變其行為;而靜態(tài)的客戶(hù)機(jī)或服務(wù)器僅僅只是對(duì)外界激勵(lì)作出反應(yīng)。
Internet開(kāi)發(fā)包括以下四種情形:
靜態(tài)的客戶(hù)機(jī)和靜態(tài)的服務(wù)器
靜態(tài)的客戶(hù)機(jī)和活動(dòng)的服務(wù)器
活動(dòng)的客戶(hù)機(jī)和靜態(tài)的服務(wù)器
活動(dòng)的客戶(hù)機(jī)和活動(dòng)的服務(wù)器
靜態(tài)的客戶(hù)機(jī)和靜態(tài)的服務(wù)器
靜態(tài)的客戶(hù)向靜態(tài)的服務(wù)器發(fā)送請(qǐng)求,服務(wù)器響應(yīng)該請(qǐng)求并返回一個(gè)文件。一旦HTML頁(yè)面被下載到客戶(hù)端, 客戶(hù)機(jī)和服務(wù)器的連接就終止,直到服務(wù)器接受到下一個(gè)請(qǐng)求。在使用FTP下載文件或是Usernet閱讀新聞時(shí)也會(huì)發(fā)生同樣的情形。
結(jié)合靜態(tài)客戶(hù)機(jī)的功能即為用Visual Basic中和Internet技術(shù)相關(guān)的ActiveX控件創(chuàng)建一個(gè)FTP工具,一個(gè)Web瀏覽器或是一個(gè)新聞讀者等等。這些性能也可以被集成到一個(gè)大的應(yīng)用程序中。
靜態(tài)的客戶(hù)機(jī)和活動(dòng)的服務(wù)器
假如你正在使用一個(gè)靜態(tài)的客戶(hù)端, 例如和一個(gè)當(dāng)前應(yīng)用程序相連接的Web瀏覽器窗體, 以下載一個(gè)HTML頁(yè)面,上面有文本框以輸入查詢(xún)內(nèi)容,還有按鈕以把用戶(hù)輸入的條目作為一個(gè)字符串發(fā)送給服務(wù)器。當(dāng)你發(fā)送完文本之后,服務(wù)器返回一個(gè)已定制過(guò)的HTML頁(yè)面-往往是通過(guò)調(diào)用一個(gè)DLL中的函數(shù), 上面有你查詢(xún)的結(jié)果。這就是一個(gè)"活動(dòng)的"服務(wù)器的例子, 它自動(dòng)處理數(shù)據(jù)并根據(jù)條件返回一個(gè)定制的結(jié)果。
創(chuàng)建活動(dòng)服務(wù)器的途徑之一就是通過(guò)使用Visual Basic開(kāi)發(fā)的DLL并用Oleisapi2.dll實(shí)現(xiàn)訪(fǎng)問(wèn)。Oleisapi2.dll包含在Windows NT Server 4.0之中,是Internet Information Server (IIS)的一種功能,它包括了ISAPI的函數(shù)功能集。通過(guò)IIS和Oleisapi2.dll, 你可以在Web服務(wù)器上部署DLL, 并從客戶(hù)端使用HTML頁(yè)面上的信息或調(diào)用其方法。
活動(dòng)的客戶(hù)機(jī)和靜態(tài)的服務(wù)器
當(dāng)客戶(hù)機(jī)擁有處理能力時(shí)稱(chēng)之為活動(dòng)的客戶(hù)機(jī)。活動(dòng)的客戶(hù)機(jī)擁有本地處理任務(wù)的能力,而不是請(qǐng)求服務(wù)器幫助處理。在客戶(hù)機(jī)/服務(wù)器應(yīng)用中,本地處理的能力不僅提高了任務(wù)完成的速度,而且減輕了服務(wù)器的負(fù)擔(dān)。
活動(dòng)客戶(hù)機(jī)的情形有很多種。例如,用Visual Basic構(gòu)建的ActiveX文檔幾乎可以包括所有傳統(tǒng)應(yīng)用的功能。當(dāng)你把它放到一個(gè)容器中時(shí), 例如Internet Explorer, 你的客戶(hù)端就完全擁有了傳統(tǒng)Visual Basic中所有的動(dòng)態(tài)功能。客戶(hù)端也可以通過(guò)在一個(gè)HTML頁(yè)面中使用VBScript調(diào)用ActiveX控件或DLL實(shí)現(xiàn)。
活動(dòng)的客戶(hù)機(jī)和活動(dòng)的服務(wù)器
如果采用活動(dòng)客戶(hù)機(jī)和活動(dòng)服務(wù)器的模式可以充分發(fā)揮優(yōu)勢(shì): 分布式的功能便于擴(kuò)展,靈活的解決方案可以充分利用系統(tǒng)和網(wǎng)絡(luò)資源。
在三層結(jié)構(gòu)的客戶(hù)機(jī)/服務(wù)器環(huán)境中開(kāi)發(fā)部署的應(yīng)用中,其組件分布于整個(gè)網(wǎng)絡(luò)上, 總起來(lái)完成提供用戶(hù)界面, 實(shí)現(xiàn)業(yè)務(wù)準(zhǔn)則和數(shù)據(jù)訪(fǎng)問(wèn)的功能,而且由于可以充分利用客戶(hù)端和服務(wù)器端的處理能力,可以實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)訪(fǎng)問(wèn)功能。
一個(gè)活動(dòng)的服務(wù)器可以負(fù)責(zé)跟蹤客戶(hù)提交的查詢(xún)表格,提交查詢(xún)并返回結(jié)果。一個(gè)活動(dòng)的客戶(hù)機(jī)則負(fù)責(zé)將返回的結(jié)果展現(xiàn)給用戶(hù), 然后將改變的內(nèi)容返回給服務(wù)器。另外通過(guò)Internet組件的下載,當(dāng)用戶(hù)訪(fǎng)問(wèn)Web站點(diǎn)時(shí), 可以自動(dòng)更新客戶(hù)端提交查詢(xún)和處理結(jié)果的準(zhǔn)則。
[在Web上使用ActiveX組件]
ActiveX組件為Internet技術(shù)帶來(lái)了新的功能。通過(guò)Internet組件的下載,超連接,菜單協(xié)商等各種功能,將ActiveX組件和Internet集成起來(lái),內(nèi)容和應(yīng)用程序之間的界線(xiàn)也越來(lái)越模糊。另外由于在站點(diǎn)上(在客戶(hù)機(jī)和服務(wù)器之間)分布功能函數(shù),我們可以創(chuàng)建更具擴(kuò)展性和靈活性的站點(diǎn)。
在Internet應(yīng)用程序中使用ActiveX文檔
使用ActiveX文檔, 我們可以開(kāi)發(fā)和Internet/Intranet站點(diǎn)的其他元素緊密集成的Visual Basic的應(yīng)用程序。利用這些組件開(kāi)發(fā)出來(lái)的應(yīng)用程序,用戶(hù)可以透明地在HTML頁(yè)面和ActiveX文檔之間遷移。
可以把ActiveX文檔作為Visual Basic為Internet提供的應(yīng)用。幾乎所有現(xiàn)在用標(biāo)準(zhǔn)應(yīng)用程序完成的工作都可以用ActiveX文檔實(shí)現(xiàn)。
作為HTML頁(yè)面中的一個(gè)元素,如果在用戶(hù)的客戶(hù)機(jī)上沒(méi)有安裝ActiveX文檔, 當(dāng)用到它們時(shí), 可以自動(dòng)地從網(wǎng)上下載;如果客戶(hù)機(jī)上的版本比較舊, 也可以可以自動(dòng)升級(jí)。ActiveX文檔的許多特性提供了很好的安裝,導(dǎo)航性能,并可以保證很好的持續(xù)一致性:
Internet組件的下載---你可以創(chuàng)建一個(gè)到你的ActiveX文檔的連接,使瀏覽器可以自動(dòng)找到并下載所有需要的組件。
超連接對(duì)象---在一個(gè)超連接感知的包容器中,你可以使用Visual Basic的超連接對(duì)象的屬性和方法以跳轉(zhuǎn)到一個(gè)給定的URL或是通過(guò)歷史的記錄清單進(jìn)行導(dǎo)航。
菜單和協(xié)商---由于可以從Word或Excel中獲得文檔,Visual Basic的ActiveX文檔提供了將其菜單嵌入瀏覽器中的菜單的功能。例如當(dāng)文檔被裝載入Internet Explorer中后,瀏覽器的菜單將和你為該ActiveX文檔創(chuàng)建的菜單混合。
PropertyBag---當(dāng)你在Internet Explorer中部署一個(gè)ActiveX文檔時(shí), 你可以通過(guò)PropertyBag對(duì)象保持?jǐn)?shù)據(jù)的一致性。
下面我們來(lái)看一看如何在Internet Explorer中部署一個(gè)ActiveX文檔。假設(shè)我們要通過(guò)一個(gè)HTML頁(yè)面中的超連接連接到這個(gè)ActiveX文檔上:
1. 用HTML創(chuàng)建引用這個(gè)ActiveX文檔的連接。
由于ActiveX文檔將在Internet Explorer中取代HTML頁(yè)面,所以有必要將組件的OBJECT標(biāo)簽放在另一個(gè)HTML頁(yè)面中。當(dāng)跳轉(zhuǎn)到該頁(yè)面后,一旦ActiveX文檔被裝載,它就會(huì)立刻消失。
2. 用HTML為瀏覽器提供下載、注冊(cè)以及導(dǎo)航到這個(gè)ActiveX文檔的途徑。在OBJECT標(biāo)簽中應(yīng)該說(shuō)明ActiveX文檔的類(lèi)ID和CODEBASE屬性。
3. 在同一頁(yè)面上, 使用VBScript指示Internet Explorer立刻通過(guò)相應(yīng)的.vbd文件導(dǎo)航到該ActiveX文檔上。
在Internet應(yīng)用程序中使用ActiveX控件
ActiveX控件為你的HTML頁(yè)面帶來(lái)了活力。通過(guò)HTML和VBScript, 你可以在一個(gè)HTML頁(yè)面上使用ActiveX控件, 設(shè)置它們的屬性,調(diào)用它們的方法并處理它們的事件。一個(gè)包含控件的的HTML頁(yè)面仿佛一個(gè)Visual Basic的設(shè)計(jì)窗口。ActiveX控件可以提供更多的交互式的,生動(dòng)的用戶(hù)界面特性,使HTML頁(yè)面變得更加有活力。
一般需要通過(guò)HTML和VBScript的綜合手段引用并控制ActiveX控件的行為。使用HTML為瀏覽器提供下載,注冊(cè)并引用ActiveX控件引用的途徑。在HTML代碼的OBJECT標(biāo)簽中需要包括:
控件的類(lèi)別ID, 以使程序能在Windows的注冊(cè)表中找到它們;
ID的屬性,以便在VBScript中引用該控件(類(lèi)似于Visual Basic中的Name屬性);
CODEBASE屬性,告訴瀏覽器如果組件不在客戶(hù)機(jī)上該去哪兒找;
PARAM NAME標(biāo)簽,設(shè)置控件的屬性參數(shù)。
然后用VBScript編寫(xiě)處理單擊事件的代碼,使每一個(gè)控件被單擊后,程序可以作相應(yīng)的動(dòng)作。
Visual Basic專(zhuān)業(yè)版中還包括了三個(gè)已預(yù)先設(shè)計(jì)好的用于包裹Internet相關(guān)技術(shù)的控件, 使你能夠擴(kuò)展已有的應(yīng)用程序,它們是:
Internet Transfer Control---包裹了三種通用的Internet協(xié)議:HTTP, FTP和Gopher;
WebBrowser Control---包含了許多通過(guò)Internet Explorer可以獲得的功能;
WinSock Control---使你可以連接到一臺(tái)遠(yuǎn)程的機(jī)器, 然后通過(guò)UDP或TCP交換數(shù)據(jù)。
通過(guò)使用這些控件, 你可以添加從FTP站點(diǎn)自動(dòng)下載文件的功能,還可以為Visual Basic IDE提供Web瀏覽器的Add-in。
在Internet應(yīng)用程序中使用ActiveX代碼組件
無(wú)論是在客戶(hù)端或是在服務(wù)器端, 都可以使用ActiveX代碼組件(.dll或.exe文件), 從而為HTML頁(yè)面添加功能。
在客戶(hù)端部署代碼組件, 由于用戶(hù)的命令無(wú)須通過(guò)網(wǎng)絡(luò)傳輸回服務(wù)器,可以大大提高運(yùn)行速度。服務(wù)器端的組件同樣也可以有顯示用戶(hù)界面可視化元素的功能。通過(guò)下載一個(gè)DLL, 我們可以在HTML頁(yè)面上添加用戶(hù)界面的元素,如一個(gè)登錄對(duì)話(huà)框; 還可以提供幕后的客戶(hù)端處理能力,例如一個(gè)伴隨VBScript的函數(shù)庫(kù)。
客戶(hù)端的部署工作類(lèi)似于對(duì)ActiveX控件的使用,你同樣需要使用HTML和VBScript代碼引用并編寫(xiě)代碼組件。下面給出了一個(gè)用HTML和VBScript代碼編寫(xiě)調(diào)用DLL以顯示登錄對(duì)話(huà)框的實(shí)例:
1. 使用HTML創(chuàng)建一個(gè)窗體,其中包含一個(gè)按鈕以調(diào)用登錄對(duì)話(huà)框:
Click here to login in:
2. 用HTML為瀏覽器提供下載,注冊(cè)及引用ActiveX組件的途徑:
Classid="clsid:2F390484-1C7D-11D0-8908-00A0C90395F4"
id="Login"
codebase="Login.cab#version=1,0,0,0">
3. 用VBScript調(diào)用組件中的方法以顯示登錄對(duì)話(huà)框:
組件自身中將包含用于形成登錄字符串的代碼,并將它發(fā)送給服務(wù)器用于驗(yàn)證。另一種將DLL和Internet技術(shù)結(jié)合的方法是將它部署在服務(wù)器端。如果你有Internet Information Server (IIS)-包含在Windows NT Server 4.0中, 你可以通過(guò)Visual Basic關(guān)盤(pán)中的Tools目錄下的Oleisapi2.dll調(diào)用Visual Basic中內(nèi)置的DLL函數(shù)。Oleisapi2.dll中包含了ISAPI中的所有函數(shù)。你可以把DLL部署在HTTP服務(wù)器上, 并通過(guò)HTML頁(yè)面上發(fā)送的信息調(diào)用其方法。Oleisapi2.dll作為客戶(hù)請(qǐng)求到DLL之間的中介。由于代碼是基于HTML的,這些請(qǐng)求僅僅是簡(jiǎn)單的URL。通過(guò)服務(wù)器端的DLL可以由客戶(hù)提供的參數(shù)定制返回給客戶(hù)的HTML頁(yè)面,還可以管理數(shù)據(jù)庫(kù)的連接,對(duì)接受到的請(qǐng)求和返回的結(jié)果進(jìn)行整理和編組。
程序啟動(dòng)時(shí),如何自動(dòng)判斷 MDB文件是否損壞并自動(dòng)修復(fù)? [返回]
若程序使用 MDB文件 ,當(dāng) MDB 文件損壞時(shí),一進(jìn)入程序,便會(huì)出現(xiàn)以下訊息:
Can't open database 'name'. It may not be a database that your application recognizes, or the file may be corrupt. (Error 3049)
若是程序中未加入錯(cuò)誤判斷,程式便會(huì)中斷跳出,這會(huì)給使用者極不好的印象,要避免這種情形,甚至不讓使用者發(fā)現(xiàn)MDB文件損壞,便要加入以下之程序代碼加以判斷:
Private Sub Form_Load()
Dim db As Database
On Error GoTo Error1
Set db = OpenDatabase("c:\test.mdb")
On Error GoTo 0
: '正常程序開(kāi)始
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -