用VisualBasic設計Windows門禁程序
用過98的朋友都知道98自帶了一個身份驗證的程序,但它對不聯網的計算機的安全不起什么保護作用。按一下"Esc"或者點擊"取消",就可以進入系統。基于這點本程序將做到:
1) 如果用戶不能正確輸入用戶信息將不能進入系統。
2) 屏蔽Ctrl+Alt+Del組合鍵,避免用戶利用"結束任務"關閉程序。
3) 程序窗體上不能有關閉按鈕。
4) 限制用戶輸入信息的次數,超過三次就關閉計算機。
5)避免程序進行非法操作,否則, 呵呵,Windows可會通過一個非法操作對話框自動結束程序的。
明確了注意事項,我們就可以開始了。
首先進入VB界面,啟動一個"標準EXE"程序。
建立下面這個窗體
![]() 圖 1 |
具體步驟是:
鼠標單擊Form1窗體。在屬性框(Properties)(如圖2)中設置窗體的"名稱"為frmMain,接下來程序中就用這個名字代替這個窗體了,把屬性列表最下邊的Windowstate屬性設置為"2-Maximized"。BorderStyle 屬性設置為 0-None,去掉窗體上邊的按鈕。程序中每個窗體和控件都有自己的屬性集合,用鼠標選中它們屬性窗口中都會顯示出被選中物體的屬性集。注意,因為本程序要求用戶輸入密碼,為了防止別人看到密碼,我們可以修改textbox控件的password屬性,隨便設置一個字符就可以,包括空格。
![]() 圖2 |
在VB界面的右下角有一個叫做"窗體布局"的窗體,在其中可以看到一個"顯示器"和代表程序窗體的圖形,通過拖動該圖形移動可以改變窗體運行時窗體在實際屏幕中的位置。一般把它設在屏幕中間偏上的位置。如圖3所示:
![]() 圖3 |
VB帶有很多圖標(.ICO格式的),它們都位于Microsoft Visual StudioCommonGraphicIcon目錄。Picture box控件中的笑臉圖片來自那里。窗體中"用戶名"及"口令"的后邊設置快捷鍵的方法是在相應Label的caption屬性中輸入"名稱(&字母)",比如窗體中"用戶名(U)"標簽的Caption屬性應設置為"用戶名(&U)"。這樣按"Alt+字母"就可以直接寫那部分信息了。寫入漢字之后,如果繪制的Label比輸入的信息的空間大,你會發現輸入的字都在標簽的左邊,如果你不想這樣,單擊"用戶名"標簽,在"屬性"窗口中的"名稱"下邊找到"Alignment"屬性,它的屬性控制字符在容器中的位置,其中的英語標出了它的三種狀態。按照你的喜好挑選就行了。
現在添加其他的窗體,選中圖4中"工程資源管理器"窗體中的frmMain,
![]() 圖4 |
用鼠標右鍵點擊它(開始時"窗體"中只有frmMain),出現一個彈出的菜單,在依次選擇"添加"-〉"添加窗體",選擇"新建"-〉"窗體",點擊"確定"。在"屬性"中設置它的"名稱"為frmAdduser,最后結果如圖5所示
![]() 圖5 |
在添加窗體的時候,我們也可以在出現的選擇窗體類型的窗體中選擇那些系統預制的窗體。比如我們可以選擇其中的"登錄對話框"作為修改用戶信息前的身份驗證窗體。按照上述步驟添加該窗體。選擇預制的窗體的好處是很多屬性不用設置,比較適合像我這樣的懶人。添加后的窗體如圖6所示
![]() 圖6 |
依次添入其他兩個窗體,分別命名為frmBoard(圖7)和frmAbout(圖8)
![]() 圖7 |
![]() 圖8 |
窗體建完了。我們可以開始編寫程序了。
為了屏蔽Ctrl+Alt+Del組合鍵,須調用一個Windows API(Application Programming Interface,應用程序接口)函數。該函數的聲明最好放在模塊(module)中,那樣每個窗體的程序中都可以調用它。
在工程中添加一個模塊(module),具體步驟與添加窗體類似。編程時讀者自己實踐一下就知道了。先添加一個模塊,然后在VB界面的主菜單中單擊"外接程序"選擇"外接程序管理器"在出現的窗口中選擇"VB 6 API Viewer"并雙擊它。在它的后邊會出現"加載"。單擊"確定"關閉窗口。這時"外接程序"中出現"API 瀏覽器"選項,選擇它,屏幕上會出現"API瀏覽器"的窗口,單擊"文件"-〉"加載文本文件"-〉win32api.txt,在可用項中選擇SystemParametersInfo(屏蔽Ctrl+Alt+Del的函數),單擊"添加",之后單擊"插入",將SystemParametersInfo函數的聲明部分加入到模塊中,按同樣的步驟添加函數 ExitWindowsEx函數(調用它可以關閉計算機)。Api函數調用后,要給它的常數付值,比如ExitWindowsEx的常數EWX_FORCE和EWX_SHUTDOWN都要付值,否則函數無效。模塊部分的具體代碼如下:
| Const SPI_SETSCREENSAVEACTIVE = 97 ' 聲明一個常量 Const EWX_FORCE = 4 Const EWX_SHUTDOWN = 1 Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal_ dwReserved As Long) As Long Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA"_ (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As_ Long) As Long Public Sub Disable(Disable As Boolean) '定義一個函數屏蔽 Ctrl+Alt+Del 組合鍵,因為是 '用Public定義的,所以程序中可以直接調用函數。用語句 call disable(statement) 就可以完成調用了 Dim x As Long x = SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, Disable, CStr (1), 0) End Sub ' 這個函數也適用于NT和2000,但在那里完成本功能還需要獲得相應的權限。 |
下面就可以開始編寫代碼了。在"工程資源管理器"中選中frmMain,雙擊之后,這個窗體就會出現在界面的中間。雙擊"確定"按鈕,出現代碼窗口,顯示如下兩行:
| Private Sub Command1_Click () End sub |
表示現在要對Command1(命令按鈕)控件的Click(單擊)事件編寫代碼,當程序運行時單擊Command1控件后,計算機就執行這段代碼。有關Command1的事件有很多,在代碼窗口的上方有兩個下拉菜單,第一個顯示當前窗體中的控件列表,第二個顯示當前控件的事件列表。要對哪個控件的哪個事件編寫代碼可以在列表中直接選擇,之后代碼窗口中會自動添加代碼的起始和結束標記。就像上邊的command1.click一樣。
因為我們的程序允許用戶添加和修改用戶信息,所以要把這些信息儲存在文件中。這就要涉及到文件操作。VB有十分強大的文件操作能力,它的基本語句是OPEN語句,語法:
| Open pathname For mode [Access access] [lock] As [#] filenumber [Len=reclength] |
Mode, 必要。關鍵字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,則以 Random 訪問方式打開文件。
Filenumber, 必要。一個有效的文件號,范圍在 1 到 511 之間。使用 FreeFile 函數可得到下一個可用的文件號。
對文件做任何 I/O 操作之前都必須先打開文件。如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打開文件時,可以建立這一文件。
如果文件已由其它進程打開,而且不允許指定的訪問類型,則 Open 操作失敗,而且會有錯誤發生。
在 Binary、Input 和 Random 方式下可以用不同的文件號打開同一文件,而不必先將該文件關閉。在 Append 和 Output 方式下,如果要用不同的文件號打開同一文件,則必須在打開文件之前先關閉該文件。
一般我們使用時用Open pathname for mode as # filenumber 就夠了。
在這里我們選用較簡單的順序存儲文件進行操作。Append和Output的區別是Append用于追加文件內容,Output用于改寫文件內容。比如,現在要對文件c:a.txt進行操作,在a.txt中現存若干用戶信息,當執行語句 Open "c:a.txt"for Append as #1 Write #1,username,password Close #1 把username和password的內容追加到文件中。如果第一條語句換作 Open "c:a.txt" for output as #1 文件原存的信息全部丟失,改為username和password中的信息
Input 語句的語法是: Input #filenumber ,[變量名1],[變量名2],… 用這個語句可以有一個以上的變量,在本例中,文件中存放的信息是 用戶名和密碼 兩項,所以用兩個變量就可以把他們讀出來。如果只用了一個變量,那就只能讀出用戶名。這里有一點需要注意的是 用戶名和密碼之間應該有一個逗號,且兩個變量在相同的輸出區,否則要出錯。
向順序文件中輸出信息使用語句write和 print, write 的語法是: Write #filenumber,expressions, print 的語法是: print #filenumber,expressions. 它們都可以輸出多個變量。Print 表達式間以逗號分隔時,輸出的多個變量分別在不同的輸出區中,輸出區的長度默認值為14字節,變量間沒有逗號。如果以分號間隔,各變量間無間隙,以緊湊格式輸出。
Write語句把多變量輸出在同一個輸出區中,變量間有逗號,并且每個變量在寫入文件后都以外加引號的形式出現。
對文件的操作我們先介紹到這里,下面我們邊看代碼邊分析,這是主窗體的源代碼。VB中解釋程序不處理單引號后的部分。
frmMain '首先是變量聲明部分 '*************************************************** Dim x As Boolean ' 聲明一個布爾型的變量x,布爾型變量的值只能是 true 和false Dim i As Integer '聲明一個整型變量i,整型變量的取值范圍在-32768'32767之間 Dim ext as Long '聲明一個長整型的變量,用來記錄ExitWindowsEx函數的返回值。 '整型變量的取值范圍-2,147,483,648 到 2,147,483,647 '如果變量值超出了所屬變量類型的取值范圍,會因為溢出而引起系統出錯,中斷程序執行 Dim username, password as String 聲明兩個字符型變量,分別代表用戶名和密碼 '**************************************************** '不用循環語句但還想讓程序循環的運行,可以靠事件的驅動 '**************************************************** Private Sub Command1_Click() ' Private說明子程序sub是"私有"的,即作用范圍僅限于這個窗體(frmMain) ' Command1.click表示command1控件的click事件。整個一句的意思是在窗體frmMain ' 中用鼠標單擊(click)command1控件會引發下面的程序。 On Error Resume Next ' 這句是出錯處理,意思是執行下邊的代碼時忽略非法操作,繼續執行下面的每一條指令 ' 如果沒有這句,那么如果程序執行時有非法操作,將停止執行。 If i < 3 Then ' i 是計數器,整型變量系統默認的初值為0 Open "c:windowsuse.txt" For Input As #1 '打開文件 Input #1, user, password '讀取數據 If Text1.Text <> user Or Text2.Text <> password Then ' Or 表示邏輯"或"運算,意思是兩個條件中只要有一個滿足,就執行下邊的程序。 i = i + 1 ' 當輸入的信息不正確的時候i自動加1 Picture1.Picture = LoadPicture ("d:program filesMicrosoft visual studiocommongraphicsiconsmiscface01.ico") MsgBox "不要妄圖進入系統!", vbExclamation + vbOKOnly, "" Text1.Text = "" ' 當用戶輸入的信息不正確時,清空文本框中的信息準備下次輸入 Text2.Text = "" Text1.SetFocus End If ' 每種編程語言的條件語句和循環語句開始和結束都有標志,并且成對出現。End if 就是 ' VB中if 語句的結束標志,它結束的是離它最近的if。 Else ' 輸入信息三次出錯之后,執行下列程序 Picture1.Picture = LoadPicture ("d:program filesMicrosoft visual studiocommongraphicsiconsmiscface04.ico") ' 改變卡通的表情 MsgBox "用戶非法!", vbExclamation, "" ' 顯示 "用戶非法" ext = ExitWindowsEx(EWX_SHUTDOWN, 0) ' 調用模塊中聲明的API函數,關閉計算機。 End If If user = Text1.Text And password = Text2.Text Then '用戶輸入了正確的信息 Call Disable(False) End ' 程序運行結束 End If Close #1 ' 關閉文件 End Sub '**************************************************** ' "取消"按鈕 Private Sub Command2_Click() Text1.Text = "" Text2.Text = "" ' 點擊Command2(取消)后清空文本框。系統等待用戶重新輸入信息 End Sub '**************************************************** ' "退出"按鈕 Private Sub Command3_Click() ext = ExitWindowsEx(EWX_SHUTDOWN, 0) ' 點擊這個按鈕之后直接關閉計算機 End Sub '**************************************************** ' "修改"按鈕 Private Sub Command4_Click() frmmain.Hide frmLogin.Show ' 點擊這個鍵隱藏主程序窗體,顯示驗證身份程序窗體 End Sub '**************************************************** ' "關于"按鈕 Private Sub Command5_Click() frmAbout.Show frmmain.Hide ' 跟Command4的Click事件一樣,它的作用是啟動其他窗體。 End Sub '*************************************************** ' frmMain窗體被裝入內存時執行下列程序 Private Sub Form_Load()' Call Disable(True) ' 屏蔽Ctrl+Alt+Del 組合鍵 If Dir$("c:windowsuse.txt") = "" Then ' 如果 "c:windowsuse.txt"文件不存在,說明本程序在這臺機器上沒有被運行過 MsgBox "這時本程序第一次運行,請您先輸入用戶名和密碼", vbInformation + vbOKOnly, "感謝您使用門禁系統" ' 出現提示框,通知用戶輸入用戶名和密碼 frmBoard.Show ' 顯示添加新用戶窗口 frmMain.Hide ' 隱藏當前窗口 End If ' 結束 if 條件語句 End Sub Private Sub Picture1_Click() Beep ' 點擊Picture box控件時 發出"嘟嘟"聲 End Sub '************************************************** '在text1文本框中按下回車鍵所觸發的事件 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then ' 如果按下的鍵是回車鍵。回車鍵的Ascii 碼是13, Text2.SetFocus ' 光標移動到Text2文本框中,這樣可以簡便用戶的操作 End If End Sub '************************************************* ' 跟上邊Text1的一樣,只是這次的焦點移動到"確定"按鈕上 Private Sub Text2_KeyPress (KeyAscii As Integer) If KeyAscii = 13 Then Command1.SetFocus End If End Sub |
frmMain窗體的程序編寫完了,有興趣的讀者可以自己編寫其他幾個窗體的程序,其他的幾部分程序跟上面介紹的主程序有很多相似之處。可以根據上邊列出的各模塊功能編寫,也可以自己另行設計。關鍵在于參與,程序不編是肯定不行的,別太不自信,其實不很難的。
VB中可以不定義變量,而由程序自動定義為Variant類型。但建議你在編程序的時候主動定義變量,這樣有助于在程序出錯時加以更正,也便于程序的快速執行。為此你可以在標題欄的"工具"-〉"選項"-〉"編輯器"中選擇"要求變量定義"。定義變量可以使用 Dim,Static,Public,Private等語句。需要注意的是變量的作用范圍,由于本文的目的是介紹編程的經驗就不做多的解釋了。一般的書上都可以看到。







