CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

' VB关机心得笔记

楼主hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)2004-09-04 12:56:26 在 VB / API 提问

'                 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

相关问题

  • 紧急!VB怎样关机啊?谢谢!!
  • 急,用VB写w2K的关机代码!
  • 用VB远程关机如何做?
  • vb怎么实现定时关机?
  • vb取笔记本网卡mac地址发生的问题
  • 请教如何在VB中直接关机
  • 在VB中关机是如何实现的?
  • 送分题!!如何用VB实现关机??重启???
  • 用VB如何实现定时提醒关机?
  • VB怎样调用系统的关机程序?

关键词

  • vb
  • nt
  • 关机
  • ewx
  • exitwindowsex
  • 呼叫
  • 开机
  • reboot
  • shutdown
  • faq

得分解答快速导航

  • 帖主:hot1kang1
  • hhjjhjhj
  • RUKYO
  • vincentzpf
  • starsoulxp
  • ywpg

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo