VB在Win2000下实现关机
来源:互联网 发布:如何开展网络政治工作 编辑:程序博客网 时间:2024/04/29 07:57
大家可能都知道在Win98下实现关机只须使用ExitWindows或ExitWindowsEx这两个API函数就可以,但是到了Windows2000下就不好使了,不论设置什么参数都只是注销,下面教你如何实现Win2000下关机。
'窗体中代码
Option Explicit
Dim uFlags As Long
Private Sub Command1_Click()
AdjustTokenPrivilegesForNT '在95/98中调用没作用,但为了和NT兼容,写上无妨
ExitWindowsEx EWX_REBOOT, 0 '这里将uFlgs换成以上面标记蓝色字中所提到的四个参数之一即可
End Sub
'模块中代码
Option Explicit
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
'ExitWindowsEx的参数uflags,有四个对应值,分别是:
Public Const EWX_LOGOFF = 0 '退出(注销)
Public Const EWX_SHUTDOWN = 1 '关机
Public Const EWX_REBOOT = 2 '重启动
Public Const EWX_FORCE = 4 '强制关机,即不通知现在活动应用程序让其先自我关闭
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const TOKEN_QUERY = &H8
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const ANYSIZE_ARRAY = 1
Type LUID
lowpart As Long
highpart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Declare Function GetCurrentProcess Lib "kernel32" () As Long
Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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
Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
'这个函数就是用于NT关机中使用的
Sub AdjustTokenPrivilegesForNT()
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
hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hdlTokenHandle, False, tkp, _
Len(tkpNewButIgnored), tkpNewButIgnored, _
lBufferNeeded
End Sub
- VB在Win2000下实现关机
- 十万火急!!win2000下如何关机?
- Windows2000/WindowsXP下编程(VB)实现关机
- 使用VB在WIN2000下截获IP数据包
- 使用VB在WIN2000下截获IP数据包
- 使用VB在WIN2000下截获IP数据包
- 在win2000下实现透明窗口
- VB实现关机程序
- Sfilter在Win2000下动态加载的实现
- Sfilter在Win2000下动态加载的实现
- 在NT/2000下实现关机!
- 在win2000、winXP下看 **********
- 在win2000下编译gpkcs11
- 在win2000、winXP下看 **********
- 在win2000、winXP下看 **********
- VB实现关机,重启
- VB设计Win2000下截获IP数据包程序
- 怎么在win2000下进入dos?
- 在Linux下远程使用scp拷贝文件
- flygoldfish(长流支流)的专栏
- cncxz 博客
- Delphi字符串函数大全
- ATL中常见数据类型及其相互转换
- VB在Win2000下实现关机
- LNK2001: Unresolved External Symbol __chkesp
- 如何对指针的list列表进行排序
- Tomcat的启动分析
- 千个常用DOS命令全面收藏
- 如果……
- Asp.net2.0中的MaintainScrollPositionOnPostBack属性
- Db2 : 使用样本应用程序创建存储过程
- 走了个哥们儿。