WINDOWS关机的指令是哪条,用ExitWindows(EWX_POWEROFF|EWX_FORCE,0);只能使它注销,无法关机.
用SOFTICE跟踪以后发现WINDOWS自己用的也是这条指令可以关机,不知为什么.而现在当我关机的时候,
机子却莫名其妙地重新启动了?

解决方案 »

  1.   

    /////////首先声明3个全局变量///////////BOOL fResult;TOKEN_PRIVILEGES tkp;HANDLE hToken;
            if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    {
        MessageBox("OpenProcessToken failed!");
    }     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识
        tkp.PrivilegeCount = 1;  
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); //调整获得的权限
        
        if (GetLastError() != ERROR_SUCCESS) 
    {
                MessageBox("AdjustTokenPrivileges enable failed!");
    }     fResult =InitiateSystemShutdown( 
                 NULL,                                  // 要关的计算机用户名
                 "由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作!",  // 显示的消息
                 10,                                    // 关机所需的时间
                 TRUE,                                 // ask user to close apps 
                 TRUE);                               //设为TRUE为重起,设为FALSE为关机
      

  2.   

    同意wwq888888(天空) 的。
    可以将
    fResult =InitiateSystemShutdown( 
                 NULL,                                  // 要关的计算机用户名
                 "由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作!",  // 显示的消息
                 10,                                    // 关机所需的时间
                 TRUE,                                 // ask user to close apps 
                 TRUE);                               //设为TRUE为重起,设为FALSE为关机替换为:
    if (!ExitWindowsEx(EWX_POWEROFF | EWX_SHUTDOWN | EWX_FORCE, 0)) 
    {
    MessageBox("Error ExitWindowsEx"); 
    return FALSE;
    }
      

  3.   

    //EWX_LOGOFF,EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWN
    //EWX_FORCE,EWX_FORCEIFHUNG
    BOOL ShutDownWindows(UINT t)
    {
      OSVERSIONINFO osv;  //定义一个操作系统信息的结构体
    osv.dwOSVersionInfoSize=sizeof OSVERSIONINFO;
    GetVersionEx(&osv);   //查询当前操作系统
      if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT)  //判断是否是2000/NT
    {
      //下面为向操作系统获取权限操作
    HANDLE hProcess,hToken;
    TOKEN_PRIVILEGES Privileges;
    LUID luid;
    hProcess=GetCurrentProcess();
    //下面为打开当前进程对话
    OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
    Privileges.PrivilegeCount=1;
    LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
    Privileges.Privileges[0].Luid=luid;
    Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
    ExitWindowsEx(t,0);
    }
    else
    {
    ExitWindowsEx(t,0);//调用ExitWindowsEx关闭机器。 
    PostQuitMessage(0);
    }
    return true;
    }