说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

:为什么用exitwindowsex()不能关掉电源,而是提示“现在可以安全关机啦”后才能手动关机

编辑:说三道四文库 发布时间:2018-01-23 09:46
HTML文档下载 WORD文档下载 PDF文档下载
不会吧,我用的时候怎么没问题?ExitWindowsEx(EWX_SHUTDOWN,0)?这个函数没错的。
TO:xinfang

会不会是你的机器本身不支持“关闭电源”?
是ATX吗?
是不是电源管理设置有问题
在windows开始菜单里选“关机”,如果显示出来的是“现在可以安全关机”,那程序当然
也无能为力。
机器太老啦,呵呵
应该是机子的问题!
机器问题吧。
用汇编关闭
to ,所有人
在菜单中选择关机都能正常的关机
不的啦我机器没有问题,是atx的,装的是win2000中文版的
不过我是用vb写的,但是vb栏中没人解决,只有过来问啦
多谢,多谢
在2000中要想用ExitWindowsEx()关机的话有些麻烦。给你一个例子程序,或许有帮助




'''
'''与Windows NT关机相关的API函数和类型
'''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long



'The LookupPrivilegeValue function retrieves the locally unique
'identifier (LUID) used on a specified system to locally represent
'the specified privilege name.
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
   Alias "LookupPrivilegeValueA" _
   (ByVal lpSystemName As String, _
    ByVal lpName As String, _
    lpLuid As LUID) As Long

'Get the operating system version
Public Declare Function GetVersion Lib "kernel32" () As Long

'The GetCurrentProcess function returns a pseudohandle for the
'current process.
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

'The AdjustTokenPrivileges function enables or disables privileges
'in the specified access token. Enabling or disabling privileges
'in an access token requires TOKEN_ADJUST_PRIVILEGES access.
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
         (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
'The OpenProcessToken function opens the access token associated with
'a process.
Private Declare Function OpenProcessToken Lib "advapi32" _
   (ByVal ProcessHandle As Long, _
    ByVal DesiredAccess As Long, _
    TokenHandle As Long) As Long
    
Public Declare Function GetLastError Lib "kernel32" () As Long
Public Declare Sub SetLastError Lib "kernel32" (ByVal dwErrCode As Long)
    

Private Type LUID
    UsedPart As Long
    IgnoredForNowHigh32BitPart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
    TheLuid As LUID
    Attributes As Long
End Type

Private Type TOKEN_PRIVILEGES
   PrivilegeCount As Long
   TheLuid As LUID
   Attributes As Long
End Type

Public Const EWX_SHUTDOWN = 1 '关机常数

'''
'''调整进程的权限
'''
Public Sub AdjustToken()

      '********************************************************************
      '* This procedure sets the proper privileges to allow a log off or a
      '* shut down to occur under Windows NT.
      '********************************************************************

         Const TOKEN_ADJUST_PRIVILEGES = &H20
         Const TOKEN_QUERY = &H8
         Const SE_PRIVILEGE_ENABLED = &H2

         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

         'Set the error code of the last thread to zero using the
         'SetLast Error function. Do this so that the GetLastError
         'function does not return a value other than zero for no
         'apparent reason.
         SetLastError 0

         'Use the GetCurrentProcess function to set the hdlProcessHandle
         'variable.
         hdlProcessHandle = GetCurrentProcess()

         If GetLastError <> 0 Then
            MsgBox "GetCurrentProcess error==" & GetLastError
         End If

         OpenProcessToken hdlProcessHandle, _
            (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle

         If GetLastError <> 0 Then
            MsgBox "OpenProcessToken error==" & GetLastError
         End If

         'Get the LUID for shutdown privilege
         LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid

         If GetLastError <> 0 Then
            MsgBox "LookupPrivilegeValue error==" & GetLastError
         End If

         tkp.PrivilegeCount = 1    ' One privilege to set
         tkp.TheLuid = tmpLuid
         tkp.Attributes = SE_PRIVILEGE_ENABLED

         'Enable the shutdown privilege in the access token of this process
         AdjustTokenPrivileges hdlTokenHandle, _
                               False, _
                               tkp, _
                               Len(tkpNewButIgnored), _
                               tkpNewButIgnored, _
                               lBufferNeeded

         If GetLastError <> 0 Then
            MsgBox "AdjustTokenPrivileges error==" & GetLastError
         End If
End Sub


有了以上的声明后,在你调用ExitWindowsEx()时,首先判断一下操作系统的版本,如果是
NT,则先调用AdjustToken(),然后再调用ExitWindowsEx(),方可成功。
不是这样的,关闭Windows2000是可以的,但是之后还要手动关闭电源,我也碰到过这样的问题,不知道怎么解决?
to:turbo(我是菜鸟我要分) 
打开win2000的高级电源管理支持
只要通過菜單能關閉電源的,則硬件緷對沒問題。
在win98下應可以直接用ExitWindows()關機。
但在win2000下需先取得關機的權限才可以,具体你可以查msdn中關于ExitWindows()的說明(要是2000版的才可以)。要用到的函數大概有OpenProcessToken(),LookupPrivilegeValue(),AdjustTokenPrivileges()這些。

我有用vc實現的完整程序,你要的話我可以給你。
好呀,管他vc,vb,我通吃嘿嘿。。
忘了emial darkleopard0@163.com,嘿嘿。。不好意思
看看是否CMOS设置和Windows电源管理设置对不对
http://www.csdn.net/expert/topic/215/215099.shtm
查看你的主板是否支持自动关机和CMOS的设置。
如果主板不支持自动关机就只能手动了。
可能是主板\电源的问题,以前的老电源不能支持自动关机
你的参数用错了
注意,你大概用的是EWX_SHUTDOWN,这个参数的意思是
Shuts down the system to a point at which it is safe to turn off the power. 
就是让你手动poweroff
建议你试试EWX_POWEROFF
可直接关机,msdn上是这样说的:
Shuts down the system and turns off the power. The system must support the power-off feature. 
科技vs政治:FTC对Google的反垄断调查结束背后 威胁百度:奇虎360确认将与谷歌达成合作关系 Facebook更新Messenger应用 推免费网络电话服务 网上疯传iOS7概念设计:Dashboard是真是假? 过时的UI设计 Ubuntu手机系统前途不被看好 怎么做IE风格的工具栏 那里有project98下载?或者转化为project2000/2002的工具? 一个不难的问题,今天之内兑现分数!先谢谢各位哥儿们! 开发短信收发软件,用电脑串口对手机进行操作,我想请问 AT指令对手机型号有区别吗?SGM和CDMA的AT指令是一样的吗? 天那,J2EE 1.4出来了!!!! 关于"透明窗体"的研究和再讨论 关于得到系统温度的编程 在eclipse下写jsp怎么不出现动态提醒? 冰雪,我找你啊:再问一个很低级的问题,在wsad中jdbc的问题 地球的重量是太空的多少 原来,在太空城里,一切物体的重量都只有地球上的重量 当黑洞遇到白洞会怎么样?很奇怪的问题~谢谢 如果任意物体在太空中都没有重量,那地球也同样没有重 地球在宇宙中算什么选项有三个1 地球在宇宙里举足轻 英语翻译写错了,是重量不同 宇宙里有黑洞,那有没有白洞呢? 怎样预防各种灾害作文 内容包括预防地震、交通事故、 地震自救案例 中年男子躲商场男厕偷拍男人 事败后迅曼城出线在望图雷遭球迷种族歧视 俱乐范佩西或因与主帅不和被雪藏 赛前对话高校生“共享”淫秽视频 “随手之举”南京科委坦言不完全排除靠关系申请科技驻加蓬大使夫人杨宝珍会见加参议院副议143条主干道15座立交桥垂直绿化 天津首条定制公交开通:全程23公里 米歇尔时尚经揭秘:师从杰奎琳·肯尼迪20岁新星入选篮球峰会 代表世界队战望断天涯路之拳术永恒信念之路玄穹仙帝真魔化仙破空武帝横琴口岸旅游温泉景区旅游冰水泉旅游可鲁克湖和托素湖旅游老院子旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘