利用Windows API獲得系統進階功能 鄒剛
VB無疑是最先進的編程工具之一,但在涉及windows 32位系統的核心編程方面——譬如一些進階功能的實現上,它仍然顯得有些力不從心,這需要我們充分利用vb的強大的Windows API函數調用能力來彌補。以下代碼將向您展示如何利用Windows API控制系統托盤(表徵圖)區、開始菜單、工作列以及禁用/起用ctrl-alt-del、退出網路登入、立即關機、重新啟動等系統進階功能。
啟動VB6,建立一個標準exe工程,添加14個command按鈕,caption屬性依次為 “隱藏開始菜單”、“顯示開始菜單”、“隱藏系統托盤”、“顯示系統托盤”、“禁用 ctrl-alt-del”、“起用 ctrl-alt-del”、“隱藏工作列”、“顯示工作列”、“立即重新啟動”、“關機”、“退出網路登陸”、“顯示關機對話方塊”,調整上述控制項到適當位置,雙擊表單,寫入以下代碼:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'尋找視窗列表中第一個符合指定條件的最上層視窗
'lpClassName指向包含了視窗類別名的空中止(C語言)字串的指標;或設為零,'表示接收任何類
'lpWindowName指向包含了視窗文本(或標籤)的空中止(C語言)字串的指標;'或設為零,表示接收任何視窗標題
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
'控制視窗的可見度
'hwnd視窗控制代碼,要向這個視窗應用由nCmdShow指定的命令
'nCmdShow為視窗指定可視性方面的一個命令
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
'在視窗列表中尋找與指定條件相符的第一個子視窗
'hWnd1在其中尋找子的父視窗
'hWnd2從這個視窗後開始尋找。這樣便可利用對FindWindowEx的多次調用找到合格所有子視窗。如設為零,表示從第一個子視窗開始搜尋
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long)
'退出windows,並用特定的選項重新啟動
Private 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
'允許擷取和設定數量眾多的windows系統參數
'uAction指定要設定的參數
Private Const EWX_LOGOFF = 0'中止進程,然後登出
Private Const EWX_SHUTDOWN = 1'關掉系統電源
Private Const EWX_REBOOT = 2'重新引導系統
Private Const EWX_FORCE = 4'強迫中止沒有響應的進程
Private Const SPI_SCREENSAVERRUNNING = 97
Private Sub Command1_Click() '隱藏開始菜單
Dim Handle As Long, FindClass As Long
FindClass = FindWindow("Shell_TrayWnd", "")
Handle = FindWindowEx(FindClass, 0, "Button", vbNullString)
ShowWindow Handle, 0
End Sub
Private Sub Command11_Click() '起用 ctrl-alt-del
Dim ret As Integer
Dim pOld As Boolean
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
End Sub
Private Sub Command12_Click() '禁用 ctrl-alt-del
Dim ret As Integer
Dim pOld As Boolean
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)
End Sub
Private Sub Command13_Click() '立即重新啟動
ExitWindowsEx EWX_REBOOT, 0
End Sub
Private Sub Command14_Click() '關機
ExitWindowsEx EWX_SHUTDOWN, 0
End Sub
Private Sub Command15_Click() '退出網路登陸
ExitWindowsEx EWX_LOGOFF, 0
End Sub
Private Sub Command16_Click() '顯示關機對話方塊
ExitWindowsEx EWX_FORCE, 0
End Sub
Private Sub Command2_Click() '顯示開始菜單
Dim Handle As Long, FindClass As Long
FindClass = FindWindow("Shell_TrayWnd", "")
Handle = FindWindowEx(FindClass, 0, "Button", vbNullString)
ShowWindow Handle, 1
End Sub
Private Sub Command5_Click() '隱藏系統托盤
Dim FindClass As Long, Handle As Long
FindClass = FindWindow("Shell_TrayWnd", "")
Handle = FindWindowEx(FindClass, 0, "TrayNotifyWnd", vbNullString)
ShowWindow Handle, 0
End Sub
Private Sub Command6_Click() '顯示系統托盤
Dim FindClass As Long, Handle As Long
FindClass = FindWindow("Shell_TrayWnd", "")
Handle = FindWindowEx(FindClass, 0, "TrayNotifyWnd", vbNullString)
ShowWindow Handle, 1
End Sub
Private Sub Command7_Click() '顯示工作列
Dim FindClass As Long, FindClass2 As Long, Parent As Long, Handle As Long
FindClass = FindWindow("Shell_TrayWnd", "")
FindClass2 = FindWindowEx(FindClass, 0, "ReBarWindow32", vbNullString)
Parent = FindWindowEx(FindClass2, 0, "MSTaskSwWClass", vbNullString)
Handle = FindWindowEx(Parent, 0, "SysTabControl32", vbNullString)
ShowWindow Handle, 0
End Sub
Private Sub Command8_Click() '隱藏工作列
Dim FindClass As Long, FindClass2 As Long, Parent As Long, Handle As Long
FindClass = FindWindow("Shell_TrayWnd", "")
FindClass2 = FindWindowEx(FindClass, 0, "ReBarWindow32", vbNullString)
Parent = FindWindowEx(FindClass2, 0, "MSTaskSwWClass", vbNullString)
Handle = FindWindowEx(Parent, 0, "SysTabControl32", vbNullString)
ShowWindow Handle, 1
End Sub