如何在软件中嵌入关机功能?    看别人软件中有自动关机功能,自己也想作一个,但自己又拿不准,请大家指点!
我只知道别人用了RunDll32.exe,ShellExecute函数等什么的;但我在windows XP下发现
ShutDown.exe -s -t 0 可关机,但不知道如何做在软件中,请大家示范说明,本人十分感激!
请列出还有那些方法,那种方法比较好!

解决方案 »

  1.   

    好发现呢,呵呵ShutDown.exe -s -t 0shell "ShutDown.exe -s -t 0"是不是就可以了啊。检测操作系统版本,9X内核可以直接调用API关机,NT内核提升权限后调用API关机。API关机的代码网上很多,自己找找。
      

  2.   

    [转]Windows 2000 下的关闭计算机由于NT下关机还要获得相应的权限,你可以使用下面的代码  
           AdjustTokenPrivilegesForNT'先获得权限  
           ExitWindowsEx  uFlags,  0  
     
    下面是相关的函数  
    Declare  Function  ExitWindowsEx  Lib  "user32"  (ByVal  uFlags  As  Long,  ByVal  dwReserved  As  Long)  As  Long  
     
    Public  Const  EWX_LOGOFF  =  0  
    Public  Const  EWX_SHUTDOWN  =  1  
    Public  Const  EWX_REBOOT  =  2  
    Public  Const  EWX_FORCE  =  4  
     
    Public  Const  TOKEN_ADJUST_PRIVILEGES  =  &H20  
    Public  Const  TOKEN_QUERY  =  &H8  
    Public  Const  SE_PRIVILEGE_ENABLED  =  &H2  
    Public  Const  ANYSIZE_ARRAY  =  1  
     
    Type  LUID  
           lowpart  As  Long  
           highpart  As  Long  
    End  Type  
     
    Type  LUID_AND_ATTRIBUTES  
           pLuid  As  LUID  
           Attributes  As  Long  
    End  Type  
     
    Type  TOKEN_PRIVILEGES  
           PrivilegeCount  As  Long  
           Privileges(ANYSIZE_ARRAY)  As  LUID_AND_ATTRIBUTES  
    End  Type  
     
    Declare  Function  GetCurrentProcess  Lib  "kernel32"  ()  As  Long  
    Declare  Function  LookupPrivilegeValue  Lib  "advapi32.dll"  Alias  "LookupPrivilegeValueA"  (ByVal  lpSystemName  As  String,  ByVal  lpName  As  String,  lpLuid  As  LUID)  As  Long  
    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  
    Declare  Function  OpenProcessToken  Lib  "advapi32.dll"  (ByVal  ProcessHandle  As  Long,  ByVal  DesiredAccess  As  Long,  TokenHandle  As  Long)  As  Long  
     
    Sub  AdjustTokenPrivilegesForNT()  
     
           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  
     
           LookupPrivilegeValue  "",  "SeShutdownPrivilege",  tmpLuid  
           tkp.PrivilegeCount  =  1  
           tkp.Privileges(0).pLuid  =  tmpLuid  
           tkp.Privileges(0).Attributes  =  SE_PRIVILEGE_ENABLED  
     
           AdjustTokenPrivileges  hdlTokenHandle,  False,  tkp,  _  
                                                       Len(tkpNewButIgnored),  tkpNewButIgnored,  _  
                                                       lBufferNeeded  
     End  Sub  
    ---------------------------------------------------------------  
     
    这是我做的一个定时关机的程序  
    Option  Explicit  
     
    Dim  mDattime          As  Date  
     
    Private  Declare  Function  ExitWindowsEx  Lib  "user32"  (ByVal  uFlags  As  Long,  ByVal  dwReserved  As  Long)  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  Long,  ReturnLength  As  Long)  As  Long  
    Private  Declare  Function  GetTokenInformation  Lib  "advapi32.dll"  (ByVal  TokenHandle  As  Long,  ByVal  TokenInformationClass  As  Long,  TokenInformation  As  Any,  ByVal  TokenInformationLength  As  Long,  ReturnLength  As  Long)  As  Long  
    Private  Declare  Function  LookupPrivilegeValue  Lib  "advapi32.dll"  Alias  "LookupPrivilegeValueA"  (ByVal  lpSystemName  As  String,  ByVal  lpName  As  String,  ByRef  lpLuid  As  LARGE_INTEGER)  As  Long  
     
    Private  Declare  Function  OpenProcessToken  Lib  "advapi32.dll"  (ByVal  ProcessHandle  As  Long,  ByVal  DesiredAccess  As  Long,  TokenHandle  As  Long)  As  Long  
    Private  Declare  Function  GetCurrentProcessId  Lib  "kernel32"  ()  As  Long  
    Private  Declare  Function  GetCurrentProcess  Lib  "kernel32"  ()  As  Long  
    Private  Declare  Function  OpenProcess  Lib  "kernel32"  (ByVal  dwDesiredAccess  As  Long,  ByVal  bInheritHandle  As  Long,  ByVal  dwProcessId  As  Long)  As  Long  
    Private  Declare  Function  CloseHandle  Lib  "kernel32"  (ByVal  hObject  As  Long)  As  Long  
     
    Private  Const  EWX_LOGOFF  =  0                          '注销当前用户  
    Private  Const  EWX_POWEROFF  =  8                      '关闭系统并关闭电源  
    Private  Const  EWX_SHUTDOWN  =  1                      '关闭系统使之能安全关闭电源  
    Private  Const  EWX_REBOOT  =  2                          '关闭系统并重启  
    Private  Const  EWX_FORCE  =  4                            '应用程序强制关闭  
    Private  Const  EWX_FORCEIFHUNG  =  16              '如果应用程序已挂起,强制关闭  
     
    Private  Const  SE_PRIVILEGE_ENABLED  =  &H2  
    Private  Const  SE_PRIVILEGE_ENABLED_BY_DEFAULT  =  &H1  
    Private  Const  SE_PRIVILEGE_USED_FOR_ACCESS  =  &H80000000  
     
    Private  Const  TOKEN_ADJUST_PRIVILEGES  =  &H20  
    Private  Const  TOKEN_QUERY_SOURCE  =  &H10  
    Private  Const  TOKEN_QUERY  =  &H8  
     
    Private  Const  ANYSIZE_ARRAY  =  1  
     
    Private  Const  SE_SHUTDOWN_NAME  =  "SeShutdownPrivilege"  
     
    Private  Const  PROCESS_SET_INFORMATION  =  &H200  
    Private  Const  PROCESS_QUERY_INFORMATION  =  &H400  
     
    Private  Type  LARGE_INTEGER  
           lowpart  As  Long  
           highpart  As  Long  
    End  Type  
     
    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(0)  As  LUID_AND_ATTRIBUTES  
    End  Type  
     
    Private  Sub  Command1_Click()  
     
     
             mDattime  =  CDate(txtHour.Text  &  ":"  &  txtMinute.Text)  
                   Form1.WindowState  =  1  
     
     
    End  Sub  
    Private  Sub  Shutdown()  
     
     Dim  lAPIReturn  As  Long  
     
     Dim  tTOKPRI  As  TOKEN_PRIVILEGES  
     Dim  tLUID  As  LUID  
     Dim  tLarInt  As  LARGE_INTEGER  
     Dim  lRequired  As  Long  
     Dim  hTokHan  As  Long  
     Dim  hProcess  As  Long  
       
       
     
     If  LookupPrivilegeValue(vbNullString,  SE_SHUTDOWN_NAME,  tLarInt)  =  0  Then  
       MsgBox  "Get  LUID  error!",  vbOKOnly,  "Error"  
       Exit  Sub  
     End  If  
     
     tLUID.highpart  =  tLarInt.highpart  
     tLUID.lowpart  =  tLarInt.lowpart  
     
     tTOKPRI.PrivilegeCount  =  1  
     tTOKPRI.Privileges(0).Attributes  =  SE_PRIVILEGE_ENABLED  
     tTOKPRI.Privileges(0).pLuid  =  tLUID  
     
     hProcess  =  GetCurrentProcess()  
     lAPIReturn  =  OpenProcessToken(hProcess,  TOKEN_ADJUST_PRIVILEGES  +  TOKEN_QUERY,  hTokHan)  
     lAPIReturn  =  AdjustTokenPrivileges(hTokHan,  0,  tTOKPRI,  Len(tTOKPRI),  0,  0)  
    '  lAPIReturn  =  ExitWindowsEx(EWX_LOGOFF,  0)  
    '  lAPIReturn  =  ExitWindowsEx(EWX_SHUTDOWN,  0)  
     lAPIReturn  =  ExitWindowsEx(EWX_POWEROFF,  0)  
    '  lAPIReturn  =  ExitWindowsEx(EWX_REBOOT,  0)  
    '  lAPIReturn  =  ExitWindowsEx(EWX_FORCE,  0)  
    '  lAPIReturn  =  ExitWindowsEx(EWX_FORCEIFHUNG,  0)  
     If  lAPIReturn  =  0  Then  
       MsgBox  "Function  calling  error!",  vbOKOnly,  "错误"  
     End  If  
     
     lAPIReturn  =  CloseHandle(hTokHan)  
     
    End  Sub  
     
     
     
    Private  Sub  Form_Load()  
       
           Timer1.Enabled  =  True  
           
    End  Sub  
     
    Private  Sub  Timer1_Timer()  
           If  Format(Time,  "hh:mm:ss")  =  mDattime  Then  
    '      If  Minute(Time)  =  0  Then  
                   Shutdown  
           End  If  
    End  Sub  
      

  3.   

    [转]如何在应用程序中实现关机功能VB 6.0开发应用程序时,用户要求在程序内部加入直接关机功能, 使操作全部集中于应用程序的内部进行。为此,笔者编制程序,进行Windows API函数调用,成功地实现了Windows 9x“关闭系统”仿真功能,满足了用户要求,现将设计过程列举如下:  一、设计关机系统界面  新建工程文件及窗体Form1,Form1中加入选项控件Option1、 Option2 、 Option3,将它们Caption 属性依次设为“关闭计算机(S)”、“重新启动计算机(R)”、“关闭所有程序并以其他用户身份登录”;再加入命令按钮Command1和Command2、Command3且Caption属性分别设为“是”、“否”、“帮助”。即设计一个Windows 98“关闭系统”的仿真界面。  二、通用事件代码中对API 函数ExitWindowsEx( )进行声明  VB 6.0应用程序设计时,调用丰富Windows API 函数能完成VB本身没有提供或无法实现的功能,这些函数都属于“操作系统”级别,能使应用程序增添不少色彩。其中ExitWindowsEx( )函数具备关闭Windows系统的功能,调用前必须进行声明:  Declare Function ExitWindowsEx Lib ″user32″( ByVal uFlags As Long,ByVal dwReserved As Long) As Long  参数说明:此函数有两个参数vFlags、dwReserved,其中vFlags参数决定用户需要做的关机操作,dwReserved参数是作为保留而没有使用。    vFlags 参数可以取以下几种常量(或相应值):    EWX_ShutDown   1 关闭计算机    EWX_ReBoot     2 重新启动计算机    EWX_LogOff     0 关闭所有程序并以其他用户身份登录  三、关机功能所有程序代码清单如下:  ′通用代码中对ExitWinwodsEx( )函数声明  Private Declare Function ExitWindowsEx Lib ″user32″ (ByVal uFlags As Long,ByVal dwReserved As Long) As Long  Const ShutDown = 1  Const ReBoot  = 2  Const LogOff  = 0    Private Sub Command1_Click()  Dim Sh As Long  If Option1.Value = True Then     ′关闭计算机选项  Sh = ExitWindowsEx(ShutDown, dwReserved)    End If    If Option2.Value = True Then     ′重新启动计算机选项    Sh = ExitWindowsEx(ReBoot, dwReserved)    End If    If Option3.Value = True Then     ′关闭所有程序并以其他用户     身份登录选项    Sh = ExitWindowsEx(LogOff, dwReserved)    End If    End Sub    Private Sub Command2_Click()    Unload Me    End Sub    F5运行程序,即进行关机操作!该功能加入用户开发的应用程序,相当实用。
      

  4.   

    下载这个就行了:http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=391&page=1添加这个模块到工程里,再作如下调用:ShutDownPC 1,Ture就会关机了.记得保存工程哦~~~嘿嘿PS:论坛游客用户名为:everyone123456