退出操作系统可以调用Windows API的ExitWindowsEx函数。在Win9x下,只要简单地调用ExitWindowsEx函数就可以实现关机或者重新启动。但是在Win 2000/XP下调用ExitWindowsEx函数时,还需要先调用AdjustTokenPrivileges函数。下面的例子在Win9x和Win 2000/XP下都可以使用。请参考程序中的注释。
例子:
1、建立一个窗体,在上面放置4个按钮,按钮设置如下:
控件 控件名 Caption属性
---------------------------------------------------
CommandButton cmdLogoff 注销
CommandButton cmdForceLogoff 强制注销
CommandButton cmdShutdown 关机
CommandButton cmdForceShutdown 强制关机
2、将下面的代码加入窗体中:
Option Explicit
Private Const EWX_LogOff As Long = 0
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_REBOOT As Long = 2
Private Const EWX_FORCE As Long = 4
Private Const EWX_POWEROFF As Long = 8
'ExitWindowsEx函数可以退出登录、关机或者重新启动系统
Private Declare Function ExitWindowsEx Lib "user32" _
(ByVal dwOptions As Long, _
ByVal dwReserved As Long) As Long
'GetLastError函数返回本线程的最后一次错误代码。错误代码是按照线程
'储存的,多线程也不会覆盖其他线程的错误代码。
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Const mlngWindows95 = 0
Private Const mlngWindowsNT = 1
Public glngWhichWindows32 As Long
' GetVersion返回操作系统的版本。
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
TheLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
'GetCurrentProcess函数返回当前进程的一个句柄。
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
'OpenProcessToken函数打开一个进程的访问代号。
Private Declare Function OpenProcessToken Lib "advapi32" _
(ByVal ProcessHandle As Long, _
ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
'LookupPrivilegeValue函数获得本地唯一的标示符(LUID),用于在特定的系统中
'表示特定的优先权。
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, _
ByVal lpName As String, _
lpLuid As LUID) As Long
'AdjustTokenPrivileges函数使能或者禁用指定访问记号的优先权。
'使能或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES访问权限。
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, _
ReturnLength As Long) As Long
Private Declare Sub SetLastError Lib "kernel32" _
(ByVal dwErrCode As Long)
Private Sub AdjustToken()
'********************************************************************
'* 这个过程设置正确的优先权,以允许在Windows NT下关机或者重新启动。
'********************************************************************
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
'使用SetLastError函数设置错误代码为0。
'这样做,GetLastError函数如果没有错误会返回0
SetLastError 0
' GetCurrentProcess函数设置 hdlProcessHandle变量
hdlProcessHandle = GetCurrentProcess()
If GetLastError <> 0 Then
MsgBox "GetCurrentProcess error==" & GetLastError
End If
OpenProcessToken hdlProcessHandle, _
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle
If GetLastError <> 0 Then
MsgBox "OpenProcessToken error==" & GetLastError
End If
' 获得关机优先权的LUID
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
If GetLastError <> 0 Then
MsgBox "LookupPrivilegeValue error==" & GetLastError
End If
tkp.PrivilegeCount = 1 ' 设置一个优先权
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
' 对当前进程使能关机优先权
AdjustTokenPrivileges hdlTokenHandle, _
False, _
tkp, _
Len(tkpNewButIgnored), _
tkpNewButIgnored, _
lBufferNeeded
If GetLastError <> 0 Then
MsgBox "AdjustTokenPrivileges error==" & GetLastError
End If
End Sub
Private Sub cmdLogoff_Click()
ExitWindowsEx (EWX_LogOff), &HFFFF
MsgBox "ExitWindowsEx's GetLastError " & GetLastError
End Sub
Private Sub cmdForceLogoff_Click()
ExitWindowsEx (EWX_LogOff Or EWX_FORCE), &HFFFF
MsgBox "调用ExitWindowsEx函数后的GetLastError " & GetLastError
End Sub
Private Sub cmdShutdown_Click()
If glngWhichWindows32 = mlngWindowsNT Then
AdjustToken
MsgBox "调用AdjustToken后的GetLastError " & GetLastError
End If
ExitWindowsEx (EWX_SHUTDOWN), &HFFFF
MsgBox "调用ExitWindowsEx函数后的GetLastError " & GetLastError
End Sub
Private Sub cmdForceShutdown_Click()
If glngWhichWindows32 = mlngWindowsNT Then
AdjustToken
MsgBox "调用AdjustToken后的GetLastError " & GetLastError
End If
ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE), &HFFFF
MsgBox "ExitWindowsEx's GetLastError " & GetLastError
End Sub
Private Sub Form_Load()
'********************************************************************
'* 当项目启动时,调用GetVersion检查操作系统。
'********************************************************************
Dim lngVersion As Long
lngVersion = GetVersion()
If ((lngVersion And &H80000000) = 0) Then
glngWhichWindows32 = mlngWindowsNT
MsgBox "在Windows NT或Windows 2000下运行"
Else
glngWhichWindows32 = mlngWindows95
MsgBox "在Windows 95/98/Me下运行"
End If
End Sub
分享到:
相关推荐
这里我们探讨的主题是如何在VC++环境下通过DLL动态链接库来截获并处理`ExitWindowsEx`函数调用,从而实现禁止关机的功能。DLL编程是一种高效且灵活的方法,允许我们插入代码到其他程序中,而无需修改它们的源代码。 ...
在 Windows API 中,我们可以调用 `ExitWindowsEx` 函数来实现计算机的注销。该函数原型如下: ```delphi function ExitWindowsEx(uFlags: DWORD; dwReserved: DWORD): BOOL; stdcall; external 'user32.dll' name ...
描述中提到的“用API函数ExitWindowsEx()实现”是指使用Windows API(应用程序接口)中的ExitWindowsEx函数来实现这个功能。ExitWindowsEx函数是Windows操作系统提供的一种系统服务,允许程序员请求系统关闭或重新...
首先,要调用系统关机窗口,我们需要使用Windows API中的`ExitWindowsEx`函数。此函数允许程序请求注销、重新启动或关闭系统。在VC++中,你需要包含`windows.h`头文件来获取这些API函数的定义。`ExitWindowsEx`的...
API函数`ExitWindowsEx`常用于程序关机,它需要传递一个参数来指定关机类型,例如完全关机或重新启动。在易语言中,你需要声明这个API函数,然后正确地传递参数来调用它。具体的易语言代码可能会如下所示: ```...
其中,`ExitWindowsEx`是一个重要的API函数,它允许应用程序请求系统关机、重启或者注销等操作。该函数定义在`kernel32.dll`库中,需要在C#代码中通过P/Invoke进行声明和调用。`ExitWindowsEx`函数的原型如下: ```...
首先,Windows API提供了诸如`ExitWindowsEx`、`InitiateSystemShutdown`和`InitiateSystemShutdownEx`这样的函数,用于执行系统级别的操作,如注销、关机和重启。让我们逐一解析这些函数: 1. **注销**: 在...
在Windows API中,`ExitWindowsEx()` 和 `InitiateSystemShutdown()` 函数被用于控制系统的关机和重启。`ExitWindowsEx()` 可以执行注销、关机或重新启动等操作,而`InitiateSystemShutdown()` 主要用于远程关闭或...
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ``` 这里的`ExitWindowsEx`函数有两个参数:`uFlags`用于指定操作类型,如关闭、重启或注销;`...
`ExitWindowsEx` 是一个Windows API函数,它允许程序请求系统执行诸如注销、重启或关闭等操作。在VB中,我们首先需要声明这个函数,并通过调用来完成相应的任务。 ##### 声明 `ExitWindowsEx` 函数 ```vb Private ...
文章通过一个具体的示例程序来详细解释了这一过程,涉及到了`ExitWindowsEx`函数的具体使用方法,并且通过几个按钮触发不同的系统关闭行为。 #### 关键知识点详解 ##### 1. Windows API与C++结合使用 在Windows...
在Windows API中,`ExitWindowsEx()`函数是用于执行关机、重启等操作的核心。它接受两个参数:一个标志值和一个进程ID。标志值决定了执行的操作类型,如`EWX_SHUTDOWN`表示关机,`EWX_REBOOT`表示重启,`EWX_LOGOFF`...
其中,`ExitWindows`方法是关键,它对应于Windows API中的`ExitWindowsEx`函数。这个函数提供了多种结束会话的方式,包括关机、注销和重启。 `ExitWindowsEx`函数的声明可能如下: ```csharp [DllImport("kernel32...
在这个特定的案例中,我们使用了`ExitWindowsEx`函数来达到这些目的。下面我们将详细讲解这个函数以及如何在C++ Builder中实现这些功能。 `ExitWindowsEx`函数是Windows API中的一个重要组成部分,它允许应用程序...
以下是一个简单的C#关机程序示例,它将调用`kernel32.dll`中的`ExitWindowsEx`函数来执行关机操作: ```csharp using System; using System.Runtime.InteropServices; public class Program { // 定义...
"vb 关机调用EXITWINDOWEX相关原代码"就是这样一个例子,它涉及到Windows API的使用,特别是`ExitWindowsEx`函数。API(应用程序接口)是操作系统提供给开发者的一组预定义函数,允许程序与操作系统进行交互。 在VB...
本文将详细介绍如何在Visual Basic中利用Windows API函数`ExitWindowsEx`来终止Windows 95系统。 #### 关键知识点解析 ##### Windows API与`ExitWindowsEx`函数 - **Windows API**(应用程序接口)是微软提供的一...
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ``` `uFlags`参数可以设置为`EWX_LOGOFF`常量,表示注销操作。然后,你可以这样调用这个函数: ...
首先,我们需要了解在Win32 API中用于控制关机的函数——`ExitWindowsEx`。这个函数允许应用程序请求系统关机、重新启动或注销。它的原型如下: ```cpp BOOL ExitWindowsEx( DWORD uFlags, DWORD dwReason ); ``` ...
首先,我们来看第一种方法,它通过调用Windows API函数`ExitWindowsEx()`来实现关机、重启或注销功能。API函数允许VB程序执行操作系统级别的任务,这些任务在VB本身的库中可能没有直接的函数对应。`ExitWindowsEx()`...