新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > .Net开发 > VC.NET教程 > 正文:编程实现Windows关机、重启、注销

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

新客网 XKER.COM 2008-04-15 来源:博客园 ZYM 收藏本文
    要想编程使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;
}
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。