首先建立一个新的工程文件,在工程文件中加入一个Module文件。在Module文件中加入以下代码:Option Explicit Public bIsWinNT As Boolean '下面就是未公开的函数定义,注意在Alias之后没有使用函数的真正名字 '而是用了函数编号,这是因为微软没有公开函数名 Declare Function SHRestartSystemMB Lib "shell32" _ Alias "#59" _ (ByVal hOwner As Long, _ ByVal sExtraPrompt As String, _ ByVal uFlags As Long) As Long Declare Function SHShutDownDialog Lib "shell32" _ Alias "#60" _ (ByVal YourGuess As Long) As Long Declare Function GetVersionEx Lib "kernel32" _ Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End TypePublic Const EWX_LOGOFF = 0 Public Const EWX_SHUTDOWN = 1 Public Const EWX_REBOOT = 2 Public Const EWX_FORCE = 4 Public Const EWX_POWEROFF = 8 Public Const shrsExitNoDefPrompt = 1 Public Const shrsRebootSystem = 2Const VER_PLATFORM_WIN32s = 0 Const VER_PLATFORM_WIN32_WINDOWS = 1 Const VER_PLATFORM_WIN32_NT = 2Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (pDest As Any, _ pSource As Any, _ ByVal ByteLen As Long) Declare Function IsTextUnicode Lib "advapi32" _ (lpBuffer As Any, _ ByVal cb As Long, _ lpi As Long) As LongPublic Const IS_TEXT_UNICODE_ASCII16 = &H1 Public Const IS_TEXT_UNICODE_REVERSE_ASCII16 = &H10 Public Const IS_TEXT_UNICODE_STATISTICS = &H2 Public Const IS_TEXT_UNICODE_REVERSE_STATISTICS = &H20 Public Const IS_TEXT_UNICODE_CONTROLS = &H4 Public Const IS_TEXT_UNICODE_REVERSE_CONTROLS = &H40 Public Const IS_TEXT_UNICODE_SIGNATURE = &H8 Public Const IS_TEXT_UNICODE_REVERSE_SIGNATURE = &H80 Public Const IS_TEXT_UNICODE_ILLEGAL_CHARS = &H100 Public Const IS_TEXT_UNICODE_ODD_LENGTH = &H200 Public Const IS_TEXT_UNICODE_DBCS_LEADBYTE = &H400 Public Const IS_TEXT_UNICODE_NULL_BYTES = &H1000 Public Const IS_TEXT_UNICODE_UNICODE_MASK = &HF Public Const IS_TEXT_UNICODE_REVERSE_MASK = &HF0 Public Const IS_TEXT_UNICODE_NOT_UNICODE_MASK = &HF00 Public Const IS_TEXT_UNICODE_NOT_ASCII_MASK = &HF000Public Function IsWinNT() As Boolean Dim osvi As OSVERSIONINFO osvi.dwOSVersionInfoSize = Len(osvi) GetVersionEx osvi IsWinNT = (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT) End FunctionPublic Function CheckString(msg As String) As String If bIsWinNT Then CheckString = StrConv(msg, vbUnicode) Else CheckString = msg End If End FunctionPublic Function GetStrFromPtr(lpszStr As Long, nBytes As Integer) As String ReDim ab(nBytes) As Byte CopyMemory ab(0), ByVal lpszStr, nBytes GetStrFromPtr = GetStrFromBuffer(StrConv(ab(), vbUnicode)) End FunctionPublic Function GetStrFromBuffer(szStr As String) As String If IsUnicodeStr(szStr) Then szStr = StrConv(szStr, vbFromUnicode) If InStr(szStr, vbNullChar) Then GetStrFromBuffer = Left$(szStr, InStr(szStr, vbNullChar) - 1) Else GetStrFromBuffer = szStr End If End FunctionPublic Function IsUnicodeStr(sBuffer As String) As Boolean Dim dwRtnFlags As Long dwRtnFlags = IS_TEXT_UNICODE_UNICODE_MASK IsUnicodeStr = IsTextUnicode(ByVal sBuffer, Len(sBuffer), dwRtnFlags) End Function然后在Form1中加入一个ComboBox控件、两个CommandButton控件,然后在Form1的代码窗口中加入以下代码: Private Sub Command1_Click() Call SHShutDownDialog(0) End Sub Private Sub Command2_Click() Dim sPrompt As String Dim uFlag As Long Select Case Combo1.ListIndex Case -1: uFlag = Val(Combo1.Text) Case 0: uFlag = shrsExitNoDefPrompt Case 1: uFlag = shrsRebootSystem End Select If SHRestartSystemMB(hWnd, sPrompt, uFlag) = vbYes Then End If End Sub Private Sub Form_Load() bIsWinNT = IsWinNT() If bIsWinNT Then 'WinNT操作系统 With Combo1 .AddItem "0 - 关闭程序并以其它用户身份登陆" .AddItem "1 - 关闭计算机" .AddItem "2 - 重新启动计算机" .Text = "" End With Else 'Win95/98操作系统 With Combo1 .AddItem "1 - 关闭计算机" .AddItem "2 - 重新启动计算机" .Text = "" End With End If Command1.Caption = "关闭系统对话框" Command2.Caption = "关闭或重新启动计算机" End Sub运行程序,点击“关闭系统对话框”按钮就可以弹出关闭系统对话框。在Combo1中选择关闭系统、重新启动或者关闭程序并以其它用户身份登陆项再点击“关闭或重新启动计算机”按钮,系统就会弹出提示对话框提示是否执行相应的操作,点击“是”就可以执行了。
Public bIsWinNT As Boolean
'下面就是未公开的函数定义,注意在Alias之后没有使用函数的真正名字
'而是用了函数编号,这是因为微软没有公开函数名
Declare Function SHRestartSystemMB Lib "shell32" _
Alias "#59" _
(ByVal hOwner As Long, _
ByVal sExtraPrompt As String, _
ByVal uFlags As Long) As Long
Declare Function SHShutDownDialog Lib "shell32" _
Alias "#60" _
(ByVal YourGuess As Long) As Long
Declare Function GetVersionEx Lib "kernel32" _
Alias "GetVersionExA" _
(lpVersionInformation As OSVERSIONINFO) As Long
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End TypePublic Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Public Const EWX_POWEROFF = 8
Public Const shrsExitNoDefPrompt = 1
Public Const shrsRebootSystem = 2Const VER_PLATFORM_WIN32s = 0
Const VER_PLATFORM_WIN32_WINDOWS = 1
Const VER_PLATFORM_WIN32_NT = 2Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pDest As Any, _
pSource As Any, _
ByVal ByteLen As Long)
Declare Function IsTextUnicode Lib "advapi32" _
(lpBuffer As Any, _
ByVal cb As Long, _
lpi As Long) As LongPublic Const IS_TEXT_UNICODE_ASCII16 = &H1
Public Const IS_TEXT_UNICODE_REVERSE_ASCII16 = &H10
Public Const IS_TEXT_UNICODE_STATISTICS = &H2
Public Const IS_TEXT_UNICODE_REVERSE_STATISTICS = &H20
Public Const IS_TEXT_UNICODE_CONTROLS = &H4
Public Const IS_TEXT_UNICODE_REVERSE_CONTROLS = &H40
Public Const IS_TEXT_UNICODE_SIGNATURE = &H8
Public Const IS_TEXT_UNICODE_REVERSE_SIGNATURE = &H80
Public Const IS_TEXT_UNICODE_ILLEGAL_CHARS = &H100
Public Const IS_TEXT_UNICODE_ODD_LENGTH = &H200
Public Const IS_TEXT_UNICODE_DBCS_LEADBYTE = &H400
Public Const IS_TEXT_UNICODE_NULL_BYTES = &H1000
Public Const IS_TEXT_UNICODE_UNICODE_MASK = &HF
Public Const IS_TEXT_UNICODE_REVERSE_MASK = &HF0
Public Const IS_TEXT_UNICODE_NOT_UNICODE_MASK = &HF00
Public Const IS_TEXT_UNICODE_NOT_ASCII_MASK = &HF000Public Function IsWinNT() As Boolean
Dim osvi As OSVERSIONINFO
osvi.dwOSVersionInfoSize = Len(osvi)
GetVersionEx osvi
IsWinNT = (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT)
End FunctionPublic Function CheckString(msg As String) As String
If bIsWinNT Then
CheckString = StrConv(msg, vbUnicode)
Else
CheckString = msg
End If
End FunctionPublic Function GetStrFromPtr(lpszStr As Long, nBytes As Integer) As String
ReDim ab(nBytes) As Byte
CopyMemory ab(0), ByVal lpszStr, nBytes
GetStrFromPtr = GetStrFromBuffer(StrConv(ab(), vbUnicode))
End FunctionPublic Function GetStrFromBuffer(szStr As String) As String
If IsUnicodeStr(szStr) Then szStr = StrConv(szStr, vbFromUnicode)
If InStr(szStr, vbNullChar) Then
GetStrFromBuffer = Left$(szStr, InStr(szStr, vbNullChar) - 1)
Else
GetStrFromBuffer = szStr
End If
End FunctionPublic Function IsUnicodeStr(sBuffer As String) As Boolean
Dim dwRtnFlags As Long
dwRtnFlags = IS_TEXT_UNICODE_UNICODE_MASK
IsUnicodeStr = IsTextUnicode(ByVal sBuffer, Len(sBuffer), dwRtnFlags)
End Function然后在Form1中加入一个ComboBox控件、两个CommandButton控件,然后在Form1的代码窗口中加入以下代码:
Private Sub Command1_Click()
Call SHShutDownDialog(0)
End Sub
Private Sub Command2_Click()
Dim sPrompt As String
Dim uFlag As Long
Select Case Combo1.ListIndex
Case -1: uFlag = Val(Combo1.Text)
Case 0: uFlag = shrsExitNoDefPrompt
Case 1: uFlag = shrsRebootSystem
End Select
If SHRestartSystemMB(hWnd, sPrompt, uFlag) = vbYes Then
End If
End Sub
Private Sub Form_Load()
bIsWinNT = IsWinNT()
If bIsWinNT Then 'WinNT操作系统
With Combo1
.AddItem "0 - 关闭程序并以其它用户身份登陆"
.AddItem "1 - 关闭计算机"
.AddItem "2 - 重新启动计算机"
.Text = ""
End With
Else 'Win95/98操作系统
With Combo1
.AddItem "1 - 关闭计算机"
.AddItem "2 - 重新启动计算机"
.Text = ""
End With
End If
Command1.Caption = "关闭系统对话框"
Command2.Caption = "关闭或重新启动计算机"
End Sub运行程序,点击“关闭系统对话框”按钮就可以弹出关闭系统对话框。在Combo1中选择关闭系统、重新启动或者关闭程序并以其它用户身份登陆项再点击“关闭或重新启动计算机”按钮,系统就会弹出提示对话框提示是否执行相应的操作,点击“是”就可以执行了。