关于VB关机的一点心得
先说一下要调用的API:
w" W' H) g, j( E+ L' n电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛$ [6 S% }6 N- l% G5 |
'目的:退出系统,所有句柄以Or连接我爱电脑技术社区--打造最好的电脑技术自学交流平台4 z# y3 ~! y, ^+ X
'输入:uFlags:EWX_FORCE:可以强迫终止没有响应的进程我爱电脑技术社区--打造最好的电脑技术自学交流平台% z& K5 x5 _% @
' EWX_LOGOFF:可以终止进程,然后注销
% r; r1 U2 {; J我爱电脑技术社区--打造最好的电脑技术自学交流平台 ' EWX_SHUTDOWN:关掉系统电源我爱电脑技术论坛1 c- \9 |0 S# U( u
' EWX_REBOOT:重新引导系统我爱电脑技术社区--打造最好的电脑技术自学交流平台2 I# D) L, D; g1 j- _" A
' dwReserved:保留,设置为0
! @6 m. G& x' l( |6 t9 f6 }我爱电脑技术论坛 '返回:非0即成功,0为失败!我爱电脑技术社区--打造最好的电脑技术自学交流平台$ {2 ]% i8 @" ~8 y- t, f
Public Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long我爱电脑技术社区--打造最好的电脑技术自学交流平台8 d0 k8 L3 y5 C5 u
'--------------------
9 e6 P+ X3 \. g0 X$ w我爱电脑技术社区--打造最好的电脑技术自学交流平台 '以下属性皆As Long电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站5 f2 |% l% A) p" X8 X1 Q8 ]
Public Const EWX_FORCE = 4我爱电脑技术论坛+ E& R0 s6 [" H1 `
Public Const EWX_LOGOFF = 0
$ ~3 Q1 E6 ?; @# W Awww.520diannao.com Public Const EWX_REBOOT = 2打造最好的电脑自学交流论坛: S( s) _* @3 m, e) }; ^
Public Const EWX_SHUTDOWN = 1电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' j9 i b2 c6 I
Public Const EWX_POWEROFF = 8
8 I7 }! g( w) y _" m7 e9 B
( i' o X( r% n) a我爱电脑技术社区--打造最好的电脑技术自学交流平台 好,我们再来看系统:
7 \5 r" I4 ]2 |. K' r- o+ @" O我爱电脑技术社区--打造最好的电脑技术自学交流平台www.520diannao.com* l# W4 I5 `' i2 [* {( V
2000以下的版本直接调用一个底层API:ExitWindowsEx()打造最好的电脑自学交流论坛9 C3 T4 f* Y/ p! M- E; p* d2 C. k G/ p$ ?
" j b% D6 m& X8 a. q& {www.520diannao.com 2000以上的,由于内核变成WinTN的了,你还要给程序一个权限才行。
: Q- t5 I. f$ ^+ C2 l5 {7 @9 Z: P我爱电脑技术论坛
# {" `# y' `% T; r7 }) ]7 y 那么我怎样赋予程序权限呢?
. v0 x% `" ?$ Z( ]www.520diannao.com我爱电脑技术社区--打造最好的电脑技术自学交流平台, ?, B! k' B1 I$ v# P. J( A' u
Public Sub AdjustToken()
) W) {. I1 Q5 C$ bwww.520diannao.com Const TOKEN_ADJUST_PRIVILEGES = &H20
# z% Q3 u- W$ u打造最好的电脑自学交流论坛 Const TOKEN_QUERY = &H8
5 }& x+ v9 D+ N( D; e我爱电脑技术论坛 Const SE_PRIVILEGE_ENABLED = &H2
/ y, M' b+ ^; w* S3 _: }打造最好的电脑自学交流论坛 '----------------
. o- w# W' E) ?; K9 j0 w我爱电脑技术论坛 Dim hdlProcessHandle As Long我爱电脑技术论坛/ K# X& W0 F# @% P1 ~
Dim hdlTokenHandle As Long
9 [ c9 o8 z( v; z! L: z Dim tmpLuid As LUID
% q- N( C2 ?0 t" p6 L* m9 Kwww.520diannao.com Dim tkp As TOKEN_PRIVILEGES电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站+ [/ t8 U1 s" I/ _
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
1 a3 f9 f; |8 w* I, t! q( g我爱电脑技术论坛 Dim lBufferNeeded As Long
( b( I$ C# e i- q) T+ {. C我爱电脑技术社区--打造最好的电脑技术自学交流平台 '----------------
6 p0 ~" L: u6 o& M3 m$ owww.520diannao.com '调用API函数 GetCurrentProcess 获取当前进程的句柄
# i( H8 y$ C2 ?( m+ j* ~我爱电脑技术社区--打造最好的电脑技术自学交流平台 hdlTokenHandle = GetCurrentProcess()电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站0 @' [4 x# I L+ Y% A: `
'----------------电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ W, v( d# f( M
'调用函数 OpenProcessToken 打开当前进程的访问代号,并存储在 hdlTokenHandle 中
) J" s' O2 ~5 R5 y$ G8 r7 p! \我爱电脑技术社区--打造最好的电脑技术自学交流平台 OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle我爱电脑技术社区--打造最好的电脑技术自学交流平台0 ` G% ^7 Y5 X" _. ?6 T4 D
'----------------
! T/ p5 |# Q( b- J7 n# I6 m! v打造最好的电脑自学交流论坛 '获取底层权限:电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- |+ R4 ^, @9 A+ K1 ?2 L
LoopupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid我爱电脑技术论坛* U5 |) W! Z" s7 n- F
tkp.PrivilegeCount = 1
4 ^* u) e) Y i& z* i# J; t tkp.TheLuid = tmpLuid" q% z3 U/ m8 f8 x
tkp.Attributes = SE_PRIVILEGE_ENABLED
/ _" }, x# ?$ D8 K& u" N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 '----------------
+ \: Q' @& i' }$ Z' f6 q '为程序获取关机权限
. V" Q' R+ Z" E; f2 t我爱电脑技术社区--打造最好的电脑技术自学交流平台 AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
2 g) o" j4 e ~; ?( i$ Wwww.520diannao.com End Sub我爱电脑技术社区--打造最好的电脑技术自学交流平台& M7 Q. R/ {2 O0 p5 B) O' E
}2 u' Z5 n# {5 G' W9 f) n7 w7 N 哈哈!这样,我们的程序就能在2000以上的环境中调用底层权限了!
, g) x* Z7 `3 P我爱电脑技术社区--打造最好的电脑技术自学交流平台
! P, b" L* {4 P- A电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 为了程序更好用,我们可以这么写:
( i& A+ q6 x+ D4 u+ X0 E5 a# z3 D打造最好的电脑自学交流论坛
. W) T5 I8 }; R% _$ ]( wwww.520diannao.com '如果操作系统不是Win 9X系列打造最好的电脑自学交流论坛. k" f6 H2 y4 e
If glngWhichWindows32 = mlngWindowsNT Then
. T# c7 M+ g& S; I' @3 f/ k( ]8 y( |www.520diannao.com '调用上面自定义过的函数AdjustToken
" T" M: K2 x' Z5 z打造最好的电脑自学交流论坛 AdjustToken
; r1 Y6 j! n) A" S8 D) fwww.520diannao.com End If
- x8 `7 g5 `2 N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 '调用API函数ExitWindowsEx关闭机子
& k; a' `' s$ S7 S8 R5 ?7 U Call ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_POWEROFF), 0)
0 w# f8 i9 N7 g0 P1 [! }电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
/ R. Y* W' [! H" M我爱电脑技术社区--打造最好的电脑技术自学交流平台 这样子就能关机了.