zoukankan      html  css  js  c++  java
  • 编程实现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;
    }

    另外可参考:http://www.sharejs.com/codes/cpp/6256

    http://wenku.baidu.com/view/b668afd028ea81c758f578f4.html

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/findumars/p/4343223.html
Copyright © 2011-2022 走看看