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