编程实现Windows关机、重启、注销

        要想编程使Windows关机、重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等。可以使用EWX_SHUTDOWN、EWX_REBOOTEWX_LOGOFF等标志常量,分别表示关机、重启、注销。另外如果加上EWX_FORCE这个标志常量的话,该表明强制执行该操作。Windows在执行以上操作的时候会首先给每个正在运行中的程序发送一个WM_QUERYENDSESSION消息,告诉它们现在我要退出系统了,你们赶快保存东西啊!如果这时候其中有某一个程序对该消息回应了“不”,系统就不会再执行以上操作了。而如果指定了EWX_FORCE标志,系统则不会发送消息去询问各个程序了,而是直接强制关闭所有程序,退出系统。所以说当指定了EWX_FORCE标志的时候要小心,因为这样做可能会丢失一些东西。(比如文件可能会没保存)。第二参数是保留参数,可能直接传递0值。另外,当在Win2K以上的操作系统执行关机和重启操作时,需要调用该函数的进程首先获得关机特权,不然函数会调用失败。

#include  < windows.h >

// 使能关机特权函数
BOOL EnableShutdownPrivilege()
{
    HANDLE hProcess 
=  NULL;
    HANDLE hToken 
=  NULL;
    LUID uID 
=  { 0 };
    TOKEN_PRIVILEGES stToken_Privileges 
=  { 0 };

    hProcess 
=  ::GetCurrentProcess();   // 获取当前应用程序进程句柄
    
    
if ( ! ::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, & hToken))   // 打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
         return  FALSE;

    
if ( ! ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME, & uID))   // 获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
         return  FALSE;

    stToken_Privileges.PrivilegeCount 
=   1 ;   // 欲调整的权限个数
    stToken_Privileges.Privileges[ 0 ].Luid  =  uID;   // 权限的LUID
    stToken_Privileges.Privileges[ 0 ].Attributes  =  SE_PRIVILEGE_ENABLED;   // 权限的属性,SE_PRIVILEGE_ENABLED为使能该权限
    
    
if ( ! ::AdjustTokenPrivileges(hToken,FALSE, & stToken_Privileges, sizeof  stToken_Privileges,NULL,NULL))   // 调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
         return  FALSE;

    
if (::GetLastError()  !=  ERROR_SUCCESS)   // 查看权限是否调整成功
         return  FALSE;

    ::CloseHandle(hToken);
    
return  TRUE;
}

// 关机函数
BOOL Shutdown(BOOL bForce)
{
    EnableShutdownPrivilege();  
// 使能关机特权函数
     if (bForce)
        
return  ::ExitWindowsEx(EWX_SHUTDOWN  |  EWX_FORCE, 0 );   // 强制关机
     else
        
return  ::ExitWindowsEx(EWX_SHUTDOWN, 0 );
}

// 注销函数
BOOL Logoff(BOOL bForce)
{
    
if (bForce)
        
return  ::ExitWindowsEx(EWX_LOGOFF  |  EWX_FORCE, 0 );   // 强制注销
     else
        
return  ::ExitWindowsEx(EWX_LOGOFF, 0 );
}

// 重启函数
BOOL Reboot(BOOL bForce)
{
    EnableShutdownPrivilege();  
// 使能关机特权函数
     if (bForce)
        
return  ::ExitWindowsEx(EWX_REBOOT  |  EWX_FORCE, 0 );   // 强制重启
     else
        
return  ::ExitWindowsEx(EWX_REBOOT, 0 );
}

int  main()
{
    Logoff(FALSE);  
// 注销
    Reboot(FALSE);   // 重启
    Shutdown(FALSE);   // 关机
    Logoff(TRUE);   // 强制注销
    Reboot(TRUE);   // 强制重启
    Shutdown(TRUE);   // 强制关机
     return   0 ;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值