' VB关机心得笔记
' VB关机心得笔记
'
'
'原创: 小许; qq:19030300 主页:http://hot1kang1.126.com
' 原代码来源网络
'——————————————————————————————————
'
'Windows 95 重新开机十分简单,只要呼叫 ExitWindowsEx API 函数就可以了
'
'Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
' ByVal dwReserved As Long) As Long
'
' Private Enum HowExitConst
' EWX_LOGOFF = 0 ' 注销
' EWX_REBOOT = 2 ' 重开机
' EWX_SHUTDOWN = 1 ' 关机
' EWX_FORCE = 4 ' 强制结束进程关机
' End Enum
'用
'Call ExitWindowsEx(how, 0)
' ' how 等於 EWX_LOGOFF 、 EWX_REBOOT 、EWX_SHUTDOWN 、 或EWX_FORCE
'——————————————————————————————————
'在2000下以上的函数就只能注销机器~~
'
'因为 NT 关机或重新开机, 原因是 NT 比较着重安全性(Security),
'而为了让 NT 关机或重新开机, 则必须在呼叫 ExitWindowsEx 之前, 呼叫
'AdjustToken 副程式就对了?
'
'以下是小菜收集的可以关闭2000的具体原码!
'希望能给VB新手带来一点帮助!
'——————————————————————————————————
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
ByVal dwReserved As Long) As Long
Enum HowExitConst
EWX_FORCE = 4 ' 强制关机
EWX_LOGOFF = 0 ' 注销
EWX_REBOOT = 2 ' 重开机
EWX_SHUTDOWN = 1 ' 可关机98 在2000下关机最后出现 现在可以安全关机问题
EWX_POWEROFF = 8 '是用来关闭Windows NT/2000/XP:计算机的:
'EWX_POWEROFF:
'Shuts down the system and turns off the power. The system must support the power-off feature.
'Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
End Enum
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Const ANYSIZE_ARRAY = 1
Private Type LUID
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias _
"LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Private 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
Private Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Private Sub AdjustToken()
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
'Get the LUID for shutdown privilege.
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1 ' One privilege to set
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
'Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _
tkpNewButIgnored, lBufferNeeded
End Sub
Private Sub command1_Click()
If MsgBox("确定要注销吗?", 32 + vbOKCancel, "提醒!") = vbOK Then
AdjustToken
Call ExitWindowsEx(EWX_LOGOFF, 0)
End If
End Sub
Private Sub command2_Click()
If MsgBox("确定要关机吗?", 32 + vbOKCancel, "提醒!") = vbOK Then
AdjustToken
Call ExitWindowsEx(EWX_POWEROFF, 0) '只能注销98可正常关闭2000
Call ExitWindowsEx(EWX_SHUTDOWN, 0) '在2000下该关机有问题!出现现在可以正常关机的提示
End If
End Sub
Private Sub command3_Click()
If MsgBox("确定要重启吗?", 32 + vbOKCancel, "提醒!") = vbOK Then
AdjustToken
Call ExitWindowsEx(EWX_REBOOT, 0)
End If
End Sub
'在 Windows 95 底下呼叫了 AdjustToken 也没关系,因为 Windows 95 并不会理会安全性的设定。
'感谢csdn的 Shikari(很久不来) 的指点!
'2004.9.4
问题点数:20、回复次数:10Top
1 楼rainstormmaster(暴风雨 v2.0)回复于 2004-09-04 13:10:13 得分 0
呵呵,不错:)
不过,也很晕,你看过faq吗:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=187439Top
2 楼zichen66()回复于 2004-09-04 13:40:20 得分 0
搞個另類點的,<灌水啊>,呵呵...
Private Declare Function ShowDownDlg Lib "Shell32" Alias "#60" (ByVal h As Long) As Long
調用時
ShowDownDlg True
就行了
Top
3 楼dongge2000(目前叫西西了)回复于 2004-09-04 13:45:30 得分 0
UPTop
4 楼hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)回复于 2004-09-04 13:52:53 得分 0
XP也是通用的吧 我不知道 对了 小第还有点问题!
~
为什么我的 写ini文件的 在2000下可以写成这个格式
[16]
a=1
b=2
c=3
而在98下就坏啦
成了
[16]
a=1
[16]
b=2
[16]
c=3
读不出来了 !!!!
用文件追加 还追加不上????原因何在,郁闷中。。望高手指点!
Top
5 楼hhjjhjhj(大头)(http://office.9zp.com)回复于 2004-09-06 00:00:46 得分 4
关机。这个不行吗
Shell "shutdown -s -t 0"Top
6 楼RUKYO(蠢蠢的男子汉 - 恋星夜柔光,舔烈酒豪情)回复于 2004-09-06 05:14:52 得分 4
UpTop
7 楼hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)回复于 2004-09-06 15:09:02 得分 0
Shell "shutdown -s -t 0"
在2000下 可以关吗? 我试试
我很菜的....................Top
8 楼vincentzpf(飞宇)回复于 2004-09-07 11:19:15 得分 4
都可以呀!Top
9 楼starsoulxp(星魂)回复于 2004-09-07 11:23:36 得分 4
学习哦Top
10 楼ywpg()回复于 2004-09-09 01:16:10 得分 4
……
这是散分的?Top




