系统定时休眠

本文介绍了一个用于Windows系统的定时休眠程序实现方法。利用SetSystemPowerState函数可以在任何情况下切断电源,无需显示提示信息。文章提供了实现代码示例,并说明了如何通过调整权限来启用该功能。
 

系统定时休眠
作者:jans

下载示例源代码

单位最近加强安全检查,除了部分服务器,下班不关机器的同事,都被罚了款。为此,我试着下载了几个自动关机的程序,但是都不好使。都是最后显示“你可以安 全地关闭计算机了!”。到网上问了半天说是高级电源管理设置的问题。我折腾了半天,还是不行,为什么Windows自己的关机就可以关掉电源,而我们的程 序就只能“你可以安全的关闭计算了!”。看来微软还不知道在哪里留了一手。
好在还有收获,最近发现MSDN还有这么一个函数

BOOL SetSystemPowerState(
BOOL fSuspend, // system state
BOOL fForce // forced suspension option
);
真是好东东,比关机器还好,在任何情况下都可以切断电源(这正是我想要的),也不会有讨厌的提示。

函数很简单,但直接用不好使,前面得加些罗哩八嗦的东东,所以我就进行了一下封装。

void  PERR(LPTSTR szAPI, DWORD dwLastError);
#define RTN_ERROR 13

INT SetPower()
{

// TODO: Add your control notificationhandler code here
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;

LPTSTR MachineName=NULL; // pointer to machine name

if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken ))
{
PERR("OpenProcessToken", GetLastError() );
return RTN_ERROR;
}

if(!LookupPrivilegeValue(MachineName, SE_SHUTDOWN_NAME, &luid))

{
PERR("LookupPrivilegeValue", GetLastError() );
return RTN_ERROR;
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL );

SetSystemPowerState(FALSE,TRUE);
return 0;

}
void PERR(
LPTSTR szAPI, // pointer to failed API name
DWORD dwLastError // last error value associated with API
)
{
LPTSTR MessageBuffer;
DWORD dwBufferLength;

//
// TODO get this fprintf out of here!
//
fprintf(stderr,"%s error! (rc=%lu)/n", szAPI, dwLastError);

if(dwBufferLength=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwLastError,
LANG_NEUTRAL,
(LPTSTR) &MessageBuffer,
0,
NULL))
{

DWORD dwBytesWritten;

//
// Output message string on stderr
//
WriteFile(GetStdHandle(STD_ERROR_HANDLE),
MessageBuffer,
dwBufferLength,
&dwBytesWritten,
NULL);

//
// free the buffer allocated by the system
//
LocalFree(MessageBuffer);
}
}

注意:此函数只运行于Windows 2000/XP,并且打开了高级电源管理的休眠支持。

根据这个函数,写了个小东东,我不想让他一直运行占我的资源。于是就在计划任务里建了一个任务,只要在检查之前执行就行。呵呵!
总之没什么高深的,我也是菜鸟,如果你知道了就不要看了,希望那些爱骂人“高手”不要骂我:-)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值