Visual Basic 6.0 (VB6) 程式語言案例學習 (05. 電腦鎖程式)
Visual Basic 6.0 (VB6) 程式語言案例學習 (05. 電腦鎖程式)¶
5.1 問題¶
一開始的需求是因為要保護個人電腦不被其他人使用,基本上使用Windows的螢幕保護程式就可以達到基本需求了,但由於螢幕保護程式是要有時間設定的,因此設定時間太短,有時候反到造成使用者不變,因為使用者有時候只是稍微停頓一下,就出現螢幕保護程式;時間設定太長,就失去保護的目的。不過螢幕保護程式本身的目的不是電腦鎖,而是為了保護電子槍(CRT)螢幕而設計的,避免某一點長時間受到電子槍的射擊,而造成損壞。有了螢幕保護程式就可以讓螢幕避免相同顏色的射擊。
因此要設計電腦鎖的程式,要能夠讓使用者馬上可以將電腦切換到鎖定模式,又可以馬上切換回工作模式。所以特別設計給不熟悉電腦的使用者,讓他們可以透過特殊按鍵,重新切換到工作模式。倘若使用的系統是Windows 2000以上的話,按下Alt+Ctrl+Del再按下鎖定電腦,就可以達到目的了,根本不需要特別去設計電腦鎖程式。
但由於辦公場合的電腦有Windows 98、Windows Me、Windows 2000、Windows XP、Windows 2003,因此希望能夠設計一個統一操作模式的電腦鎖,方便同一個群組的使用者鎖定電腦或解開電腦,這樣的需求才有意義。否則只為了鎖定電腦,或搭配其他功能去設計,根本就是白做工。這和需求者的思考方向有關,有時候需求必須考慮到實用性,而非技術性,因為我們不是在參加技術比賽。
5.2 需求¶
表格 5‑1 「電腦鎖程式」系統目的分析表
版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
---|---|---|
能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
設計一個能夠鎖定鍵盤鎖有按鍵的程式。 | 在電腦桌面上建立捷徑,方便使用者設計及啟用。 | |
可自行設定解鎖鍵及密碼。 | ||
當電腦鎖執行的時候,能夠不讓其他程式顯示。 | ||
不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
為每個人設計帳號及密碼管理。 | 結合Windows帳號管理。 | |
結合Windows AD管理。 |
表格 4‑2 「電腦鎖程式」系統目標分析表
版本: | 重要 | 不重要 |
---|---|---|
優先 | (重) | (急) |
設計一個能夠鎖定鍵盤所有按鍵的程式。 | 可自行設定解鎖鍵及密碼。 | |
不急迫 | (輕) | (緩) |
當電腦鎖執行的時候,能夠不讓其他程式顯示。 | 在電腦桌面上建立捷徑,方便使用者設計及啟用。 |
表格 5‑3 「電腦鎖程式」系統規格表
規格項目 | 規格內容 | 備註 |
---|---|---|
鎖定鍵盤 | 設計一個能夠鎖定鍵盤所有按鍵的程式。 | … |
鎖定畫面 | 當電腦鎖執行的時候,能夠不讓其他程式顯示。 | … |
設定參數 | 可自行設定解鎖鍵及密碼。 | … |
建立捷徑 | 在電腦桌面上建立捷徑,方便使用者設計及啟用。 | … |
5.3 特色¶
電腦鎖程式,可以鎖住鍵盤上所有按鍵,必須輸入密碼方可打開電腦,目前可在Windows 98、Me、2000、XP、2003上執行。保護個人電腦不會被別人使用。
5.4 使用工具¶
語言 | 軟體 |
---|---|
MS Visual Basic | MS Visual Basic 6.0、Adobe Photoshop、Ulead PhotoImpact |
5.5 系統架構¶
要設計電腦鎖程式,可參考Windows GINA,這是微軟為了讓其他廠商可以設計第三方登入辨識身分系統,而預留的一種介面。也就是說符合GINA的話,您就可以設計指紋辨識、人臉辨識、…、等等的方式,讓使用者進行登入系統的功能。但是如果是被駭客利用了,就變成偷取帳號及密碼的程式了,因為害可以做一個符合GINA的程式,假裝是登入介面,不知情的使用者輸入的帳號密碼之後,再傳送給駭客跟系統,這樣駭客就可以知道你的資訊,並且在不知情的情況下,幫你登入系統。就算改了密碼也沒有用。
還有一種方式就是透過鉤子(Hook)的方式,側錄使用者的按鍵,當使用者按下按鍵,程式會知道使用者按下甚麼按鍵,這樣就可以鎖定使用者的按鍵,方法就是去除掉使用者所按下的任何一個按鍵,除非使用者按下特殊按鍵,才允許解鎖。這種方式也是要避免被駭客使用,因為駭客可以紀錄使用者按下的任何按鍵,就可以側錄帳號或密碼,更可怕的是可以側錄到網路銀行的帳號及密碼,因為所有按鍵都會被側錄。
現在我們要開始選擇使用方法,選擇GINA的話,必須寫一個符合的DLL檔,否則會被掃毒程式辨認為駭客程式,而遭到移除。因此筆者選擇第二種方法,就是利用程式去側錄按鍵。
整個系統架構一開始就必須讓使用者設定,因此我們由設定介面來看,看使用者需求,來制定設定介面,首先獲得系統版本,這是因為Windows 98有不一樣的程式碼。然後一個解鎖按鍵設計,讓使用者可以自訂解鎖按鍵。最後是密碼框,讓使用者自訂密碼。從這裡起步,我們知道要自訂解鎖按鍵,就必須先能夠獲得按鍵值,因此只要完成了獲得按鍵值,基本上就完成50%。接下來才是鎖定螢幕畫面,這時候就要用最上層顯示,不讓其他應用程式可以顯示出來。
5.6 程式實作¶
Step 1:程式一開始就先載入設定,因此我們先來參考設定視窗的重要程式碼。
'所有變數必須宣告才能使用 Option Explicit '程式初始化事件副程式 Private Sub Form_Initialize() 'Shell Object Dim oShell As IWshShell_Class 'ShortCut Object Dim oShortcut As IWshShortcut_Class '捷徑檔的路徑 Dim fpos_path As String '執行檔的路徑 Dim sTargetPath As String '錯誤處理 On Error GoTo ErrorHandler 'Create Shell Object Set oShell = New IWshShell_Class '取得桌面的路徑位置 fpos_path = oShell.SpecialFolders.Item("Desktop") '在桌面上建立捷徑(啟動PC Security Key) Set oShortcut = oShell.CreateShortcut(fpos_path & "\PC Security Key.lnk") ' 設定捷徑屬性 With oShortcut '目標:執行檔的路徑 .TargetPath = App.Path & "\PC_Security.exe" '目標:執行檔的參數 .Arguments = "" '開始位置 .WorkingDirectory = App.Path '快速鍵 .Hotkey = "Ctrl+Alt+F1" '視窗模式 = 標準視窗 .WindowStyle = WshNormalFocus '圖示位置 .IconLocation = App.Path & "\PC_Security.exe" '存檔 .Save End With '在桌面上建立捷徑(啟動PC Security Key Setup) Set oShortcut = oShell.CreateShortcut(fpos_path & "\PC Security Setup.lnk") '設定捷徑屬性 With oShortcut '目標:執行檔的路徑 .TargetPath = App.Path & "\PC_Security.exe" '目標:執行檔的參數 .Arguments = "/SETUP" '開始位置 .WorkingDirectory = App.Path '快速鍵 .Hotkey = "Ctrl+Alt+F2" '視窗模式 = 標準視窗 .WindowStyle = WshNormalFocus '圖示位置 .IconLocation = App.Path & "\PC_Security.exe" '存檔 .Save End With '跳離副程式 Exit Sub '錯誤處理標籤 ErrorHandler: End Sub
'程式起始載入事件副程式 Private Sub Form_Load() '宣告檔案管理物件 Dim objFso As FileSystemObject '設定檔案管理物件 Set objFso = New FileSystemObject '取得作業系統版本 labSetup_OSVer.Caption = fOS_Version '設定圖檔路徑 frmSetup.txtSetup_PicFN.Text = App.Path & "\PC_Security.jpg" '取得設定的解鎖鍵,預設是空 frmSetup.txtSetup_HotKey.Text = GetSetting(App.Title, "frmSetup", "PW", "") '取得設定的密碼,預設是空 frmSetup.txtSetup_PW.Text = GetSetting(App.Title, "frmSetup", "Password", "") '顯示設定解鎖鍵文字框 frmSetup.txtSetup_HotKey.Visible = True End Sub
'程式釋放事件副程式 Private Sub Form_Unload(Cancel As Integer) '將圖檔路徑存入系統登錄 Call SaveSetting(App.Title, "frmSetup", "PicPath", App.Path & "\PC_Security.jpg") '將解鎖鍵存入系統登錄 Call SaveSetting(App.Title, "frmSetup", "PW", Trim(frmSetup.txtSetup_HotKey.Text)) '將密碼存入系統登錄 Call SaveSetting(App.Title, "frmSetup", "Password", Trim(frmSetup.txtSetup_PW.Text)) End Sub
Step 2:接下來是封鎖鍵盤的精華所在,請參考以下程式碼。
'設定所有變數必須宣告才能使用 Option Explicit '鍵盤輸入事件的常數 Private Const WH_KEYBOARD_LL = 13& 'wParam與lParam參數內容的常數 Private Const HC_ACTION = 0& '擴充鍵的旗標 Private Const LLKHF_EXTENDED = &H1& Private Const LLKHF_INJECTED = &H10& Private Const LLKHF_ALTDOWN = &H20& Private Const LLKHF_UP = &H80& '虛擬按鍵的常數 TAB Key Private Const VK_TAB = &H9 '虛擬按鍵的常數 Ctrl Key Private Const VK_CONTROL = &H11 '虛擬按鍵的常數 ESC Key Private Const VK_ESCAPE = &H1B '虛擬按鍵的常數 Windows Menu Key Private Const VK_MENU = &H92 '鍵盤的掛鉤資料結構 Private Type KBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End Type '設定掛勾的函式 Private Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long '解除掛勾的函式 Private Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long '傳送掛勾的函式 Private Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _ ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long '複製記憶體的函式 Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (pDest As Any, _ pSource As Any, _ ByVal cb As Long) '獲得鍵盤狀態的函式 Private Declare Function GetAsyncKeyState Lib "user32" _ (ByVal vKey As Long) As Integer '接收傳回值的變數 Private m_hDllKbdHook As Long
'啟用掛勾的副程式 Public Sub HookEnable() '設定與鍵盤掛勾 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _ AddressOf LowLevelKeyboardProc, _ App.hInstance, _ 0&) End Sub
'取消掛勾的副程式 Public Sub HookDisable() '判斷是否有使用掛勾 If m_hDllKbdHook <> 0 Then '取消掛勾 Call UnhookWindowsHookEx(m_hDllKbdHook) End If End Sub
'取得鍵盤傳回值得Callback Public Function LowLevelKeyboardProc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long '設定鍵盤資料結構 Static kbdllhs As KBDLLHOOKSTRUCT '判斷是否有輸入 If nCode = HC_ACTION Then '複製參數記憶體到鍵盤資料結構中 Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs)) '判斷使用者是否按下 Ctrl+Esc If (kbdllhs.vkCode = VK_ESCAPE) And _ CBool(GetAsyncKeyState(VK_CONTROL) _ And &H8000) Then Debug.Print "Ctrl+Esc blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If '判斷使用者是否按下 Alt+Tab If (kbdllhs.vkCode = VK_TAB) And _ CBool(kbdllhs.flags And _ LLKHF_ALTDOWN) Then Debug.Print "Alt+Tab blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If '判斷使用者是否按下 Alt+Esc If (kbdllhs.vkCode = VK_ESCAPE) And _ CBool(kbdllhs.flags And _ LLKHF_ALTDOWN) Then Debug.Print "Alt+Esc blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If '判斷使用者是否按下 Left Windows Menu Key If (kbdllhs.vkCode = &H5B) Then Debug.Print "MenuKey blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If '判斷使用者是否按下 Right Windows Menu Key If (kbdllhs.vkCode = &H5C) Then Debug.Print "MenuKey blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If '判斷使用者是否按下 Program Windows Menu Key If (kbdllhs.vkCode = &H5D) Then Debug.Print "Program MenuKey blocked" '取消鍵盤 LowLevelKeyboardProc = 1 '離開函式 Exit Function End If End If '其他按鍵的話,就將鍵盤傳給下一個掛勾 LowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, _ nCode, _ wParam, _ lParam) End Function
Step 3:如圖 5-1,執行之前因為沒有預設任何解鎖按鍵,所以請到DOS命令字元模式下,輸入設定參數,設定解鎖按鍵值及密碼,參數是 /SETUP。
圖 5‑1 輸入設定參數
Step 4:如圖 5-2,執行參數設定畫面,請輸入解鎖鍵,以及解鎖密碼。
圖 5‑2 參數設定畫面
Step 5:如圖 5-3,電腦鎖程式執行畫面。
圖 5‑3 電腦鎖程式執行畫面
5.7 修改重點¶
本程式為了方便讀者練習,並沒有完全鎖定全部按鍵,但是已經能夠鎖定特殊按鍵,其它的一般按鍵讀者可以藉由顯示按鍵值的方法,加以封鎖。例如:本程式為了抓圖方便,並沒有鎖定Print Screen Key,讀者有需要的話也可以將這個按鍵鎖定。
還有透過這個程式也可以寫線上遊戲的外掛程式,讓程式幫你打怪,你就可以做享其成了。
在一開始為了安全起見必須使用參數設定按鍵值,若讀者認為麻煩的話,也可以修改成有預設解鎖值,然後再讓使用者去自行設定,這也是一個便利的方式。
5.8 結論¶
程式雖小,但五臟俱全。撰寫這類的程式要心存善念,不要用在不法的用途,否則您所給予的,最後都會回到自己身上。
這程式可以應用在類似線上字典的呼叫,例如:按下Alt+D,可以叫出電腦字典。這樣就可以省去很多點選程式的動作,能夠方便使用者。
Lai Tai-Yu (賴岱佑)