编程实现Windows关机、重启、注销
来源:网络整理 网络用户发布,如有版权联系网管删除 2018-07-26
要想编程使Windows关机、重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等。可以使用EWX_SHUTDOWN、EWX_REBOOT、EWX_LOGOFF等标志常量,分别表示关机、重启、注销。另外如果加上EWX_FORCE这个标志常量的话,该表明强制执行该操作。Windows在执行以上操作的时候会首先给每个正在运行中的程序发送一个WM_QUERYENDSESSION消息,告诉它们现在我要退出系统了,你们赶快保存东西啊!如果这时候其中有某一个程序对该消息回应了“不”,系统就不会再执行以上操作了。而如果指定了EWX_FORCE标志,系统则不会发送消息去询问各个程序了,而是直接强制关闭所有程序,退出系统。所以说当指定了EWX_FORCE标志的时候要小心,因为这样做可能会丢失一些东西。(比如文件可能会没保存)。第二参数是保留参数,可能直接传递0值。另外,当在Win2K以上的操作系统执行关机和重启操作时,需要调用该函数的进程首先获得关机特权,不然函数会调用失败。
#include
//使能关机特权函数
BOOLEnableShutdownPrivilege()
{
HANDLEhProcess=NULL;
HANDLEhToken=NULL;
LUIDuID={0};
TOKEN_PRIVILEGESstToken_Privileges={0};
hProcess=::GetCurrentProcess();//获取当前应用程序进程句柄
if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))//打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
returnFALSE;
if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))//获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
returnFALSE;
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,sizeofstToken_Privileges,NULL,NULL))//调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
returnFALSE;
if(::GetLastError()!=ERROR_SUCCESS)//查看权限是否调整成功
returnFALSE;
::CloseHandle(hToken);
returnTRUE;
}
//关机函数
BOOLShutdown(BOOLbForce)
{
EnableShutdownPrivilege();//使能关机特权函数
if(bForce)
return::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);//强制关机
else
return::ExitWindowsEx(EWX_SHUTDOWN,0);
}
//注销函数
BOOLLogoff(BOOLbForce)
{
if(bForce)
return::ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0);//强制注销
else
return::ExitWindowsEx(EWX_LOGOFF,0);
}
//重启函数
BOOLReboot(BOOLbForce)
{
EnableShutdownPrivilege();//使能关机特权函数
if(bForce)
return::ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);//强制重启
else
return::ExitWindowsEx(EWX_REBOOT,0);
}
intmain()
{
Logoff(FALSE);//注销
Reboot(FALSE);//重启
Shutdown(FALSE);//关机
Logoff(TRUE);//强制注销
Reboot(TRUE);//强制重启
Shutdown(TRUE);//强制关机
return0;
}
//使能关机特权函数
BOOLEnableShutdownPrivilege()
{
HANDLEhProcess=NULL;
HANDLEhToken=NULL;
LUIDuID={0};
TOKEN_PRIVILEGESstToken_Privileges={0};
hProcess=::GetCurrentProcess();//获取当前应用程序进程句柄
if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))//打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
returnFALSE;
if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))//获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
returnFALSE;
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,sizeofstToken_Privileges,NULL,NULL))//调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
returnFALSE;
if(::GetLastError()!=ERROR_SUCCESS)//查看权限是否调整成功
returnFALSE;
::CloseHandle(hToken);
returnTRUE;
}
//关机函数
BOOLShutdown(BOOLbForce)
{
EnableShutdownPrivilege();//使能关机特权函数
if(bForce)
return::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);//强制关机
else
return::ExitWindowsEx(EWX_SHUTDOWN,0);
}
//注销函数
BOOLLogoff(BOOLbForce)
{
if(bForce)
return::ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0);//强制注销
else
return::ExitWindowsEx(EWX_LOGOFF,0);
}
//重启函数
BOOLReboot(BOOLbForce)
{
EnableShutdownPrivilege();//使能关机特权函数
if(bForce)
return::ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);//强制重启
else
return::ExitWindowsEx(EWX_REBOOT,0);
}
intmain()
{
Logoff(FALSE);//注销
Reboot(FALSE);//重启
Shutdown(FALSE);//关机
Logoff(TRUE);//强制注销
Reboot(TRUE);//强制重启
Shutdown(TRUE);//强制关机
return0;
}
另外可参考:http://www.sharejs.com/codes/cpp/6256
http://wenku.baidu.com/view/b668afd028ea81c758f578f4.html
查看评论 回复
"编程实现Windows关机、重启、注销"的相关文章
- 上一篇:不重启使XP环境变量生效
- 下一篇:开机自动启动程序的几种方法