当前位置:首页 > 操作系统 > Windows

windows C++实现注销、重启、关机 logoff reboot shutdown

实现这一功能很简单,主要需要调用一个系统API

ExitWindowsEx

功能就是,注销当前用户,关闭系统,或者重新启动系统。

它会发送一个WM_QUERYENDSESSION消息给所有的应用程序,让他们决定是不是可以被关闭。

函数原型:

 

  1. < span style = "font-size:18px;" > BOOL WINAPI ExitWindowsEx (
  2. __in UINT uFlags ,
  3. __in DWORD dwReason
  4. );
  5. </ span >
第一个参数是关闭类型,第二个是关闭的原因

 

 

第一个参数可以是:

 

EWX_LOGOFF
0

EWX_POWEROFF
0x00000008

 

EWX_REBOOT
0x00000002

EWX_RESTARTAPPS
0x00000040

 

EWX_SHUTDOWN
0x00000001

这个参数还可以可选的包含下面两个值

 

 

EWX_FORCE
0x00000004       包含这个参数可以让系统强制关机,可能会让应用程序丢失数据

 

EWX_FORCEIFHUNG
0x00000010

如果在超时时间以后应用进程仍然没有响应WM_QUERYENDSESSION或WM_ENDSESSION消息,那么就强制关闭它们。

 

返回值:

 

成功的话返回非0值,失败返回0

可以通过GetLastError()获得更多错误信息。

除了了解这个函数以外,我们还应该清楚:

 

对于windows NT以上版本的操作系统,我们需要提升一个SE_SHUTDOWN权限,才能完成关机的操作。

NT一下的则不需要,例如95,98,ME

NT以上的系统包括:

 

Microsoft Windows 2000 (Windows NT 5.0) (1999) (2000-2010) 
Microsoft Windows XP (Windows NT 5.1) (2001-2014) 
Microsoft Windows Server 2003 (Windows NT 5.2) (2003-2015) 
Microsoft Windows Server 2003 R2 (Windows NT 5.2) (2006-2015) 
Microsoft Windows Vista (Windows NT 6.0) (2006-2017) 
Microsoft Windows Server 2008 (Windows NT 6.0) (2008-2018) 
Microsoft Windows 7 (Windows NT 6.1) (2009-2020) 

 

下面我们开始具体实现:

关机功能实现

1.检查系统版本,看是不是NT以上,如果是则要提升权限

2.调用系统API,ExitWindowsEx。

  1. #pragma region 功能实现
  2. BOOL ReSetWindows ( DWORD dwFlags , BOOL bForce )
  3. {
  4. //检查参数是否正确
  5. if ( dwFlags != EWX_LOGOFF && dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN )
  6. return FALSE ;
  7. //获得系统的版本信息,让我们后面确定是否需要提升系统权限
  8. OSVERSIONINFO osvi ={ 0 };
  9. //获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的
  10. //新版本是OSVERSIONINFOEX。扩充版本
  11. osvi . dwOSVersionInfoSize = sizeof ( OSVERSIONINFO );
  12. if (! GetVersionEx (& osvi ))
  13. {
  14. return FALSE ;
  15. }
  16. //检查操作系统的版本,如果是NT类型的系统,需要提升系统权限
  17. if ( osvi . dwPlatformId == VER_PLATFORM_WIN32_NT )
  18. {
  19. //EnableShutDownPriv();
  20. }
  21. //判断是否是强制关机,强制关闭系统进程。
  22. dwFlags |=( bForce != FALSE )? EWX_FORCE : EWX_FORCEIFHUNG ;
  23. //调用API
  24. return ExitWindowsEx ( dwFlags , 0 );
  25. }
提升权限的代码:
  1. #pragma region 用来提升系统权限
  2. //这是一个通用的提升权限函数,如果需要提升其他权限
  3. //更改LookupPrivilegeValue的第二个参数SE_SHUTDOWN_NAME,即可
  4. BOOL EnableShutDownPriv ()
  5. {
  6. HANDLE hToken = NULL ;
  7. TOKEN_PRIVILEGES tkp ={ 0 };
  8. //打开当前程序的权限令牌
  9. if (! OpenProcessToken ( GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY ,& hToken ))
  10. {
  11. return FALSE ;
  12. }
  13. //获得某一特定权限的权限标识LUID,保存在tkp中
  14. if (! LookupPrivilegeValue ( NULL , SE_SHUTDOWN_NAME ,& tkp . Privileges [ 0 ]. Luid ))
  15. {
  16. CloseHandle ( hToken );
  17. return FALSE ;
  18. }
  19. tkp . PrivilegeCount = 1 ;
  20. tkp . Privileges [ 0 ]. Attributes = SE_PRIVILEGE_ENABLED ;
  21. //调用AdjustTokenPrivileges来提升我们需要的系统权限
  22. if (! AdjustTokenPrivileges ( hToken , FALSE ,& tkp , sizeof ( TOKEN_PRIVILEGES ), NULL , NULL ))
  23. {
  24. CloseHandle ( hToken );
  25. return FALSE ;
  26. }
  27. return TRUE ;
  28. }
调用方法:
  1. ReSetWindows ( EWX_LOGOFF , false ); //注销
  2. ReSetWindows ( EWX_REBOOT , true ); //重启
  3. ReSetWindows ( EWX_SHUTDOWN , true ); //关机
具体见自己代码,参见附件。
文章摘自:
http://blog.csdn.net/zy_dreamer/article/details/8948880

 

 



附件列表

 

原文:http://www.cnblogs.com/xiahaimq/p/6235679.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐