ExitWindowsEX()函数用来退出、重启或注销系统。


  函数原型:


BOOL ExitWindowsEx( 
 

 
  UINT uFlags, // 关闭参数 
 

 
  DWORD dwReserved // 系统保留,一般取0 
 

 
  );


编辑本段参数uFlag


  参数:uFlags


  指定关闭的类型。此参数必须有下列值的组合:

EWX_FORCE


  EWX_FORCE


  强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会导致应用程序丢失数据。因此,你应该只在紧急情况下使用此标志。

EWX_LOGOFF


  EWX_LOGOFF


  关闭所有进程,然后注销用户。

EWX_POWEROFF


  EWX_POWEROFF


  关闭系统并关闭电源。该系统必须支持断电。


  Windows要求:


  Windows NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。


  Windows 9X中:可以直接调用。

EWX_REBOOT


  EWX_REBOOT


  关闭系统,然后重新启动系统。


  Windows要求:


  Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。


  Windows 9X中:可以直接调用。

EWX_SHUTDOWN


  EWX_SHUTDOWN


  关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。


  Windows要求:


  Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。


  Windows 9X中:可以直接调用。


编辑本段参数dwReserved


  参数:dwReserved


  保留,这参数被忽略。一般取0。


  返回值


  如果函数成功,返回值为非零。


  如果函数失败,返回值是零。想获得更多错误信息,请调用GetLastError函数。


# include <windows.h>
# include <mmsystem.h>
# include <stdio.h>
int main()
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;
  DWORD dwVersion;
  
  dwVersion = GetVersion();         // 得到WINDOWS NT或Win32的版本号
  char buff[255];
   sprintf(buff,"%x",dwVersion);

  if(dwVersion < 0x80000000)        // 用于判断WIN系列,从而设置相应的权限
  {
   OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
   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);
   //ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
   ExitWindowsEx(EWX_SHUTDOWN , 0);

   //MessageBox(NULL,buff,"dwVersion < 0x80000000",MB_OK);
  }
  else
  {
   //ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 0);
   ExitWindowsEx( EWX_SHUTDOWN, 0);
	//MessageBox(NULL,buff,"dwVersion >= 0x80000000",MB_OK);
  }
  return 0;
}