写了个定时关机的小程序,到点关机,早睡早起。
#include<Windows.h>
BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;
return TRUE;
}
BOOL MyRegeditRun()
{
//写入注册表,开机自启动
HKEY hKey;
//找到系统的启动项
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
LPCTSTR lpValue = "shutdown";
//打开启动项Key
long lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_ALL_ACCESS, &hKey);
if(lRet == ERROR_SUCCESS)
{
char buff[MAX_PATH];
DWORD dwType = REG_SZ;
DWORD dwSize = MAX_PATH;
lRet = RegQueryValueExA(hKey, lpValue, 0, &dwType, (LPBYTE)buff, &dwSize);
char filePath[MAX_PATH];
DWORD dwRet = GetModuleFileName(NULL, filePath, MAX_PATH);
if (lRet == ERROR_SUCCESS)
{
if (!strcmp(buff, filePath))
{
//has key and value
RegCloseKey(hKey);
return TRUE;
}
}
//don't has key, set value
lRet = RegSetValueExA(hKey, lpValue, 0, REG_SZ, (BYTE *)filePath, dwRet);
if(lRet == ERROR_SUCCESS)
{
RegCloseKey(hKey);
return TRUE;
}
RegCloseKey(hKey);
}
return FALSE;
}
LONG SleepTime(UINT hour, UINT minute)
{
SYSTEMTIME time;
GetLocalTime(&time);
return (hour - time.wHour) * 3600 + (minute - time.wMinute) * 60;
}
void ReadTimeIni(int& hour, int& minute, bool isWrite = false)
{
wchar_t strPath[MAX_PATH];
wchar_t* strApp = L"Time";
::GetCurrentDirectoryW(MAX_PATH, strPath);
wcscat_s(strPath, MAX_PATH, L"\\time.ini");
if (isWrite)
{
::WritePrivateProfileStringW(strApp, L"hour", L"0", strPath);
::WritePrivateProfileStringW(strApp, L"minute", L"0", strPath);
}
else
{
hour = ::GetPrivateProfileIntW(strApp, L"hour", 0, strPath);
minute = ::GetPrivateProfileIntW(strApp, L"minute", 0, strPath);
}
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
if(MyRegeditRun())
{
SYSTEMTIME time;
GetLocalTime(&time);
int hour, minute;
ReadTimeIni(hour, minute);
long second = SleepTime(hour, minute);
if (second >= 0)
{
::Sleep(second * 1000);
if(!MySystemShutdown())
::MessageBox(NULL, "Shutdown Fail", "Error", MB_ICONERROR);
}
}
else
{
::MessageBox(NULL, "Regedit Run Error", "Error", MB_ICONERROR);
}
return 0;
}
959

被折叠的 条评论
为什么被折叠?



