VC 之关机程序的问题

  关机程序,运行之后在屏幕上显示“可以安全关闭电源”的字样,但是并未切断电源。
  因为旧版的电源不支持ATX,所以关机之后会出现那些字样。
解决方法一:
  把注册表中的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]下的PowerdownAfterShutdown键设置值为1即可。
解决方法二:

HANDLE   hToken;   
TOKEN_PRIVILEGES   tkp;   
OpenProcessToken(GetCurrentProcess(),   
				 TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken);   
LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   
					 &tkp.Privileges[0].Luid);   
tkp.PrivilegeCount   =   1;     //   one   privilege   to   set         
tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;   
AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,   
					  (PTOKEN_PRIVILEGES)NULL,   0);   
if(!ATX) 
ExitWindowsEx(EWX_SHUTDOWN|   EWX_FORCE,   0);   
else 
ExitWindowsEx(EWX_POWEROFF|   EWX_FORCE,   0);  

说明:
  判断电源是否支持ATX的代码已省略
解决方法三:
  参考代码

BOOL   fResult;TOKEN_PRIVILEGES   tkp;HANDLE   hToken; 
if   (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken))   
{ 
	MessageBox( "OpenProcessToken   failed! "); 
	return   FALSE; 
} 

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! "); 
	return   FALSE; 
} 

fResult   =InitiateSystemShutdown(   
								  NULL,                                                                     //   要关的计算机用户名 
								  "由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作! ",     //   显示的消息 
								  10,                                                                         //   关机所需的时间 
								  TRUE,                                                                   //   ask   user   to   close   apps   
								  style);                                                               //设为TRUE为重起,设为FALSE为关机 
if(!fResult)   
{   
	MessageBox( "InitiateSystemShutdown   failed. ");   
	return   FALSE; 
}   

tkp.Privileges[0].Attributes   =   0;   
AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,(PTOKEN_PRIVILEGES)   NULL,   0);   

if   (GetLastError()   !=   ERROR_SUCCESS)   
{ 
	MessageBox( "AdjustTokenPrivileges   disable   failed. ");   
	return   FALSE; 
}   

if   (style) 
{ 
	return   ExitWindowsEx(EWX_REBOOT|EWX_FORCE|EWX_POWEROFF,0); 
} 
else 
{ 
	return   ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,0); 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值