WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院软件开发VC 系统定时休眠 阅读

系统定时休眠

 2006-07-20 11:37:58 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姇閹碱偆鐥閺屾洘绻濊箛鏇犵獥闂佺厧澹婃禍婊堚€旈崘顏佸亾閿濆骸澧ù鐘欏嫮绠鹃柛顐ゅ枎閻忋儲銇勯弴妯哄姦妞ゃ垺鐟╅幃鈩冩償閵囧府鎷�
核心提示:本文示例源代码或素材下载 单位最近加强安全检查,除了部分服务器,系统定时休眠,下班不关机器的同事,都被罚了款,呵呵!总之没什么高深的,我也是菜鸟,为此,我试着下载了几个自动关机的程序

本文示例源代码或素材下载

单位最近加强安全检查,除了部分服务器,下班不关机器的同事,都被罚了款。为此,我试着下载了几个自动关机的程序,但是都不好使。都是最后显示“你可以安全地关闭计算机了!”。到网上问了半天说是高级电源管理设置的问题。我折腾了半天,还是不行,为什么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,并且打开了高级电源管理的休眠支持。

根据这个函数,写了个小东东,我不想让他一直运行占我的资源。于是就在计划任务里建了一个任务,只要在检查之前执行就行。呵呵!

总之没什么高深的,我也是菜鸟,如果你知道了就不要看了,希望那些爱骂人“高手”不要骂我:-)

Tags:系统 定时 休眠

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接