CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

小弟求助!关于ExitWindowsEx关机的问题!

楼主hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)2004-09-01 22:33:57 在 VB / API 提问

Private   Declare   Function   ExitWindowsEx   Lib   "user32"   (ByVal   uFlags   As   Long,   ByVal   dwReserved   As   Long)   As   Long  
  Const   EWX_SHUTDOWN   =   1  
  Const   EWX_LOGOFF   =   0  
  Const   EWX_REBOOT   =   2    
  Const   EWX_FORCE   =   4  
   
  Private   Sub   Command1_Click()  
  Dim   a  
  a   =   ExitWindowsEx(EWX_SHUTDOWN,   0)  
  End   Sub    
  ——————————————————————————————————————  
  在2000下  
  有个安全机制的问题!   我处理了   可以正常的关机很重起   !!!但问题!在于  
  你用a   =   ExitWindowsEx(EWX_SHUTDOWN,   0)   关机!   后出现一个  
  现在可以安全关机了     这并不是关机达到的效果啊!   怎么解决!!!!  
  望高手指点!!!!  
   
  问题点数:20、回复次数:11Top

1 楼rainstormmaster(暴风雨 v2.0)回复于 2004-09-01 22:42:48 得分 0

//这并不是关机达到的效果啊!   怎么解决!!!!  
  望高手指点!!!!  
   
  这应该是你的电源设置的问题(你要启用高级电源支持)Top

2 楼hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)回复于 2004-09-01 23:31:56 得分 0

谢谢了!@  
  设好就可以了吗!!     有什么办法用程序设吗!Top

3 楼xiaohuasz()回复于 2004-09-02 00:40:01 得分 10

可以的,你要先获得关机的权限(请参阅adjustTokenPrivileges)Top

4 楼bciAnson(Anson)回复于 2004-09-02 12:13:08 得分 10

'如果参数是false,那么关机,true   是重启  
    Sub   RebootPC(ByVal   IsReboot   As   Boolean)  
      On   Local   Error   GoTo   RebootPC_ErrorHandler  
      Const   csProcName   =   "RebootPC"  
     
      Dim   hProcessHandle   As   Long  
      Dim   hTokenHandle   As   Long  
      Dim   tmpLuid   As   LUID  
      Dim   tkpNew   As   TOKEN_PRIVILEGES  
      Dim   tkpPrevious   As   TOKEN_PRIVILEGES  
      Dim   lBufferNeeded   As   Long  
   
      hProcessHandle   =   GetCurrentProcess()  
      Call   OpenProcessToken(hProcessHandle,   TOKEN_ADJUST_PRIVILEGES   Or   TOKEN_QUERY,   hTokenHandle)  
   
  '   Get   the   LUID   for   the   shutdown   privilege  
      Call   LookupPrivilegeValue("",   "SeShutdownPrivilege",   tmpLuid)  
   
      tkpNew.PrivilegeCount   =   1   '   One   privilege   to   set  
      tkpNew.TheLuid   =   tmpLuid  
      tkpNew.Attributes   =   SE_PRIVILEGE_ENABLED  
   
  '   Enable   the   shutdown   privilege   in   the   access   token   of   this   process.  
      lBufferNeeded   =   0  
      Call   AdjustTokenPrivileges(hTokenHandle,   False,   tkpNew,   Len(tkpPrevious),   tkpPrevious,   lBufferNeeded)  
   
  '   Force   a   Reboot   (no   option   to   save   files   to   cancel   out)  
      If   IsReboot   Then  
            Call   ExitWindowsEx(EWX_FORCE   Or   EWX_REBOOT,   &HFFFF)  
      Else  
            'Call   ExitWindowsEx(EWX_SHUTDOWN,   &HFFFF)  
            Call   ExitWindowsEx(8,   0)  
      End   If  
   
      Exit   Sub  
  RebootPC_ErrorHandler:  
  '     Call   RaiseError(csModName,   csProcName,   Err.Number,   Err.Description)  
  End   SubTop

5 楼Shikari(很久不来)回复于 2004-09-02 15:06:11 得分 0

错了,微软提供了一个新参数,它才是用来关闭计算机的:  
  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.    
   
  所以当你获取了privilege后,应该ExitWindowsEx(EWX_POWEROFF,0)  
  这样就对了!Top

6 楼Shikari(很久不来)回复于 2004-09-02 15:07:37 得分 0

对了,也许VB中没有EWX_POWEROFF的值,我告诉你,EWX_POWEROFF=8   so   you   can   call   ExitWindowsEx(8,0)Top

7 楼TroubleShotting(FAQ)回复于 2004-09-02 21:37:30 得分 0

saveTop

8 楼DemonLoveLizzy(^_^)!!! 用户中文昵称 ? 是什么东东 ? :)回复于 2004-09-02 22:45:39 得分 0

一般的机器,出现“现在可以安全关机”之后,就自己断电了。我用了这么久,还没出现你说的事。Top

9 楼hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)回复于 2004-09-04 10:46:35 得分 0

谢谢   各位   高手指点Top

10 楼hot1kang1(网站制作,系统开发,记得-http://3q2008.Com)回复于 2004-09-04 12:54:46 得分 0

'                 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  
   
  Top

11 楼rainstormmaster(暴风雨 v2.0)回复于 2004-09-04 13:11:43 得分 0

呵呵,不错:)  
   
  不过,也很晕,我还以为你的代码没有问题,只是电源设置的问题呢,你看过faq吗:  
  http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=187439Top

相关问题

  • 用ExitWindowsEx函数无法关机
  • win98下用ExitWindowsEx(EWX_POWEROFF,NULL)关机,为什么总关不了?
  • ExitWindowsEx(EWX_SHUTDOWN,0)关机并关闭电源的问题。
  • 98下 ExitWindowsEx()怎样设置自动关机
  • 调用API"ExitWindowsEX"关机时出现的问题???
  • VB中用ExitWindowsEx关机,但是只能实现注销却不能重启或关机? 帮帮忙
  • 经常用ExitWindowsEx函数关机会不会对机子有较大的损伤?
  • 在Windows2000下用C#调用API(ExitWindowsEx)关机时出现的问题???
  • 关机
  • 请问怎么在NT下用Delphi实现自动关机?我试过ExitWindowsEx不好使,只在98下好使。

关键词

  • 安全
  • vb
  • nt
  • ewx
  • 关机
  • exitwindowsex
  • tkpnew
  • hprocesshandle
  • rebootpc
  • privilege

得分解答快速导航

  • 帖主:hot1kang1
  • xiaohuasz
  • bciAnson

相关链接

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

广告也精彩

反馈

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