`
isiqi
  • 浏览: 16545589 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ExitWindowsEx

阅读更多
退出操作系统可以调用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
分享到:
评论

相关推荐

    截获ExitWindowsEx函数调用

    这里我们探讨的主题是如何在VC++环境下通过DLL动态链接库来截获并处理`ExitWindowsEx`函数调用,从而实现禁止关机的功能。DLL编程是一种高效且灵活的方法,允许我们插入代码到其他程序中,而无需修改它们的源代码。 ...

    Delphi 实现计算机注销、重启、关机

    在 Windows API 中,我们可以调用 `ExitWindowsEx` 函数来实现计算机的注销。该函数原型如下: ```delphi function ExitWindowsEx(uFlags: DWORD; dwReserved: DWORD): BOOL; stdcall; external 'user32.dll' name ...

    一个自动关闭、重启计算机的例程

    描述中提到的“用API函数ExitWindowsEx()实现”是指使用Windows API(应用程序接口)中的ExitWindowsEx函数来实现这个功能。ExitWindowsEx函数是Windows操作系统提供的一种系统服务,允许程序员请求系统关闭或重新...

    VC 实现调用系统关机窗口界面

    首先,要调用系统关机窗口,我们需要使用Windows API中的`ExitWindowsEx`函数。此函数允许程序请求注销、重新启动或关闭系统。在VC++中,你需要包含`windows.h`头文件来获取这些API函数的定义。`ExitWindowsEx`的...

    易语言关机格式化源码

    API函数`ExitWindowsEx`常用于程序关机,它需要传递一个参数来指定关机类型,例如完全关机或重新启动。在易语言中,你需要声明这个API函数,然后正确地传递参数来调用它。具体的易语言代码可能会如下所示: ```...

    C#关机代码

    其中,`ExitWindowsEx`是一个重要的API函数,它允许应用程序请求系统关机、重启或者注销等操作。该函数定义在`kernel32.dll`库中,需要在C#代码中通过P/Invoke进行声明和调用。`ExitWindowsEx`函数的原型如下: ```...

    C++实现windows注销、关机和重启等操作源代码

    首先,Windows API提供了诸如`ExitWindowsEx`、`InitiateSystemShutdown`和`InitiateSystemShutdownEx`这样的函数,用于执行系统级别的操作,如注销、关机和重启。让我们逐一解析这些函数: 1. **注销**: 在...

    vc快速关机,快速重启 源代码

    在Windows API中,`ExitWindowsEx()` 和 `InitiateSystemShutdown()` 函数被用于控制系统的关机和重启。`ExitWindowsEx()` 可以执行注销、关机或重新启动等操作,而`InitiateSystemShutdown()` 主要用于远程关闭或...

    VB6.0代码编写的勾重启电脑,关闭,注销计算机等功能.

    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ``` 这里的`ExitWindowsEx`函数有两个参数:`uFlags`用于指定操作类型,如关闭、重启或注销;`...

    VB中注销, 重启和关闭计算机

    `ExitWindowsEx` 是一个Windows API函数,它允许程序请求系统执行诸如注销、重启或关闭等操作。在VB中,我们首先需要声明这个函数,并通过调用来完成相应的任务。 ##### 声明 `ExitWindowsEx` 函数 ```vb Private ...

    C++控制Windows关机

    文章通过一个具体的示例程序来详细解释了这一过程,涉及到了`ExitWindowsEx`函数的具体使用方法,并且通过几个按钮触发不同的系统关闭行为。 #### 关键知识点详解 ##### 1. Windows API与C++结合使用 在Windows...

    VC实现关机,重启,注销,休眠

    在Windows API中,`ExitWindowsEx()`函数是用于执行关机、重启等操作的核心。它接受两个参数:一个标志值和一个进程ID。标志值决定了执行的操作类型,如`EWX_SHUTDOWN`表示关机,`EWX_REBOOT`表示重启,`EWX_LOGOFF`...

    C#实现关机,注销,重启的代码文件

    其中,`ExitWindows`方法是关键,它对应于Windows API中的`ExitWindowsEx`函数。这个函数提供了多种结束会话的方式,包括关机、注销和重启。 `ExitWindowsEx`函数的声明可能如下: ```csharp [DllImport("kernel32...

    C++关机、重启、注销

    在这个特定的案例中,我们使用了`ExitWindowsEx`函数来达到这些目的。下面我们将详细讲解这个函数以及如何在C++ Builder中实现这些功能。 `ExitWindowsEx`函数是Windows API中的一个重要组成部分,它允许应用程序...

    C#关机程序

    以下是一个简单的C#关机程序示例,它将调用`kernel32.dll`中的`ExitWindowsEx`函数来执行关机操作: ```csharp using System; using System.Runtime.InteropServices; public class Program { // 定义...

    vb 关机调用EXITWINDOWEX相关原代码!!这个是调用API的

    "vb 关机调用EXITWINDOWEX相关原代码"就是这样一个例子,它涉及到Windows API的使用,特别是`ExitWindowsEx`函数。API(应用程序接口)是操作系统提供给开发者的一组预定义函数,允许程序与操作系统进行交互。 在VB...

    精彩编程与编程技巧-在Visual Basic中终止Windows 95...

    本文将详细介绍如何在Visual Basic中利用Windows API函数`ExitWindowsEx`来终止Windows 95系统。 #### 关键知识点解析 ##### Windows API与`ExitWindowsEx`函数 - **Windows API**(应用程序接口)是微软提供的一...

    VB注销、关机和重启

    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ``` `uFlags`参数可以设置为`EWX_LOGOFF`常量,表示注销操作。然后,你可以这样调用这个函数: ...

    vc写的利用win32 api函数 关机程序

    首先,我们需要了解在Win32 API中用于控制关机的函数——`ExitWindowsEx`。这个函数允许应用程序请求系统关机、重新启动或注销。它的原型如下: ```cpp BOOL ExitWindowsEx( DWORD uFlags, DWORD dwReason ); ``` ...

    VB 关闭windows系统的程式

    首先,我们来看第一种方法,它通过调用Windows API函数`ExitWindowsEx()`来实现关机、重启或注销功能。API函数允许VB程序执行操作系统级别的任务,这些任务在VB本身的库中可能没有直接的函数对应。`ExitWindowsEx()`...

Global site tag (gtag.js) - Google Analytics