看着公共上网区的电脑经常是没有关机,觉得非常浪费电力资源。因此就写了这么一个关机程序,结合定制的任务,让电脑在下班后自动关机。只所以用了多线程,是因为怕当时有人正在使用电脑,提供给用户一个选择,交互的机会。 /* 功能:用于公共上网区关闭计算机! 小弟 2009年月日:25:18 */ #include "stdafx.h" typedef void* HANDLE; typedef void* LPVOID; HANDLE Flag_Event; HANDLE Flag_Mutex; int Flag=-1; int timeout=30; DWORD WINAPI Thread_Listen(LPVOID lparam) { bool exit_flag=false; char i; while(!exit_flag) { cout<<"/n************ 公共上网区电脑,自动关机程序,请选择:********************/n"<<endl; cout<<" 确定自动、马上关机,请输入: y /n"<<endl; cout<<" 取消自动、马上关机,请输入: n /n"<<endl; cout<<" 无输入,系统将在"<<timeout<<"秒后,自动关机 /n "<<endl; cin>>i; switch(i) { case 'y': case 'Y': //cout<<"正在关机……"<<endl; WaitForSingleObject(Flag_Mutex,INFINITE); if(Flag==-1) { Flag=1; WSASetEvent(Flag_Event); } ReleaseMutex(Flag_Mutex); exit_flag=true; break; case 'n': case 'N': //cout<<"你取消了关机……"<<endl; WaitForSingleObject(Flag_Mutex,INFINITE); if(Flag==-1) { Flag=2; WSASetEvent(Flag_Event); } ReleaseMutex(Flag_Mutex); exit_flag=true; break; default: cout<<" 选择错误,请重新选择,否则系统默认"<<timeout<<"秒后自动关机"<<endl; break; } } return 0; } DWORD WINAPI Thread_Time(LPVOID lparam) { int time_leave=timeout; int i=0; while(Flag==-1) { time_leave=timeout-i*5; printf("/n 倒计时: %d 秒 /n",time_leave); if(time_leave<=0) {break;} i++; Sleep(5000); } WaitForSingleObject(Flag_Mutex,INFINITE); if(Flag==-1) { Flag=3; WSASetEvent(Flag_Event); } ReleaseMutex(Flag_Mutex); return 0; } void shut_down() /*关机函数*/ { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) cout<<"OpenProcessToken"<<endl; 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 (GetLastError() != ERROR_SUCCESS) cout<<"AdjustTokenPrivileges"<<endl; if (!ExitWindowsEx(EWX_SHUTDOWN, 0)) cout<<"ExitWindowsEx"<<endl; } int _tmain(int argc, _TCHAR* argv[]) { Flag_Mutex=CreateMutex(NULL,FALSE,NULL); Flag_Event=WSACreateEvent(); CreateThread(NULL,0,Thread_Listen,NULL,0,NULL); Sleep(1000); CreateThread(NULL,0,Thread_Time,NULL,0,NULL); WSAWaitForMultipleEvents(1,&Flag_Event,true,3*60000,false); //超时的极限是分钟 WaitForSingleObject(Flag_Mutex,3*60000); switch(Flag) { case 1: cout<<"/n………………正在自动关机………………"<<endl; shut_down(); break; case 2: cout<<"/n……………… 你取消了自动关机 ………………"<<endl; cout<<"/n………… 使用完毕后,请自觉关闭,多谢合作! …………"<<endl; cout<<"/n……………… ^_^ ………………"<<endl; cout<<"/n………… 保护环境,节约资源 ………………"<<endl; break; case 3: cout<<"/n…………倒计数时间已经到,系统将自动关机…………"<<endl; shut_down(); break; case -1: cout<<"/n…………系统错误……退出,不做更改…………"<<endl; break; } ReleaseMutex(Flag_Mutex); Sleep(3000); //停顿秒,窗口自动消失! return 0; }