【HSP3】指定した時刻にスタンバイや休止状態から復帰させるモジュール+サンプル

指定した時刻にスタンバイや休止状態から復帰させるスクリプトです。SetWaitTimer で復帰時刻を指定してください。現在時刻より前ですと復帰しませんのでご注意を。また SetPrivileges で一度だけ権限を昇格させる必要があります。

指定した時刻にスタンバイや休止状態から復帰させるスクリプトです。SetWaitTimer で復帰時刻を指定してください。現在時刻より前ですと復帰しませんのでご注意を。また SetPrivileges で一度だけ権限を昇格させる必要があります。

// http://web.archive.org/web/20060511161900/http://www.apple.ac/~namasoft/codebank/delphi2.php
#include "kernel32.as"
#include "user32.as"

#module _st_
#uselib "advapi32.dll"
#func OpenProcessToken "OpenProcessToken" int, int, var
#func LookupPrivilegeValue "LookupPrivilegeValueA" sptr, sptr, var
#func AdjustTokenPrivileges "AdjustTokenPrivileges" int, int, var, int, int, int
#uselib "powrprof.dll"
#func SetSuspendState "SetSuspendState" int,int,int
#define EWX_LOGOFF 0	// ログオフ
#define EWX_SHUTDOWN 1	// シャットダウン
#define EWX_REBOOT 2	// 再起動
#define EWX_FORCE 4 	// 強制
#define EWX_POWEROFF 8	// 電源を切る
#define TOKEN_QUERY 0x08
#define TOKEN_ADJUST_PRIVILEGES 0x20
#define SE_SHUTDOWN_NAME "SeShutdownPrivilege"
#define SE_PRIVILEGE_ENABLED 0x02

#deffunc SetWaitTimer int y, int m, int d, int h, int min, int s
	if hTimer != 0 : return -1
	dim systime, 4
	dim filetime, 2
	dim utctime, 2
	wpoke systime, 0, y
	wpoke systime, 2, m
	wpoke systime, 6, d
	wpoke systime, 8, h
	wpoke systime, 10, min
	wpoke systime, 12, s
	wpoke systime, 14, 0
	SystemTimeToFileTime varptr(systime), varptr(filetime)
	LocalFileTimeToFileTime varptr(filetime), varptr(utctime)
	CreateWaitableTimer 0, 0, 0
	hTimer = stat
	SetWaitableTimer hTimer, varptr(utctime), 0, 0, 0, 1
return
#deffunc SetSystemPower int mode, int force
	f = 0
	if force == 1 : f = EWX_FORCE
	switch mode
		case 0
			// ログオフ
			ExitWindowsEx (f + EWX_LOGOFF), 0
			swbreak
		case 1
			// シャットダウン
			ExitWindowsEx (f + EWX_SHUTDOWN), 0
			swbreak
		case 2
			// 再起動
			ExitWindowsEx (f + EWX_REBOOT), 0
			swbreak
		case 3
			// 電源を切る
			ExitWindowsEx (f + EWX_POWEROFF), 0
			swbreak
		case 4
			// 休止状態
			SetSuspendState 1, 0, 0
			swbreak
		case 5
			// スタンバイ
			SetSuspendState 0, 0, 0
			swbreak
		case 6
			// 休止状態(自動復帰しない様子)
			SetSystemPowerState 0, force
			swbreak
		case 7
			// スタンバイ(自動復帰しない様子)
			SetSystemPowerState 1, force
			swbreak
	swend
return stat
// 待機用
#deffunc SetWaitForSingleObject
	if hTimer == 0 : return -1 
	WaitForSingleObject hTimer, 0xFFFFFFFF
	SetThreadExecutionState 0x00000001 | 0x00000002
	CloseHandle hTimer
	if stat != 0 : hTimer = 0
return 0
// タイマーのクリア
#deffunc ClearTimer
	if hTimer == 0 : return -1 
	CloseHandle hTimer
	if stat != 0 : hTimer = 0 : return 0
return -1
// 権限昇格
#deffunc SetPrivileges
	dim Luid, 2
	dim tokenNew, 16
	dim tokenPre, 16
	GetCurrentProcess
	hProcess = stat
	OpenProcessToken hProcess, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, hToken
	if stat == 0 : return -1
	LookupPrivilegeValue 0, SE_SHUTDOWN_NAME, Luid
	if stat == 0 : return -2
	tokenNew(0) = 1
	memcpy tokenNew(1), Luid, 8
	tokenNew(3) = SE_PRIVILEGE_ENABLED
	AdjustTokenPrivileges hToken, 0, tokenNew, 16, varptr(tokenPre), varptr(ret)
	if stat == 0 : return -3
return 0
#global

// サンプル

	// 一度は権限昇格させる
	SetPrivileges
	
	// 復帰時刻を指定
	// 以下の例は 2012年1月14日 0時21分0秒 に復帰させるために指定
	// 現在時刻より前の時刻ですと復帰しませんので注意!
	SetWaitTimer 2012, 1, 14, 0, 21, 0
	
	// スタンバイしてみる
	; 第1引数のパラメータ
	; 0 = ログオフ
	; 1 = シャットダウン
	; 2 = 再起動
	; 3 = 電源を切る
	; 4 = 休止状態
	; 5 = スタンバイ
	; 6 = 休止状態(自動復帰しない)
	; 7 = スタンバイ(自動復帰しない)
	; 第2引数は強制するかどうか?
	; 1 を指定すると強制モード、0 だと強制しない
	SetSystemPower 5, 1
	
	// SetSystemPower を実行後↓処理してください
	SetWaitForSingleObject
	
	// タイマーのクリア(正常に処理された場合は必要なし)
	;ClearTimer
	
	dialog "復帰!"