系统待机 / 休眠
----------------------------------------------------------------------------------------------
DECLARE Long SetSuspendState IN PowrProf ;
Long Hibernate, Long ForceCritical, Long DisableWakeEvent
SetSuspendState( 0, 0, 0 )
三个参数的含义如下:
Hibernate - 0 / 1: 0 - 进入待机状态, 1 - 进入休眠状态
ForceCritical - 0 / 1: 0 - 不强行终止运行中的进程 / 强行终止
DisableWakeEvent - 0 / 1: 0 - 允许系统事件唤醒计算机 / 不允许
这个 dll 中也包含了用于检索系统电源能力的函数,其中有三个是:
IsPwrHibernateAllowed, IsPwrShutdownAllowed, IsPwrSuspendAllowed,看名字就知道是查什么的了,都不需要参数,但 MS 建议不要使用它们,以后的操作系统可能不再支持,建议使用 GetPwrCapabilities 来替代,这个函数的原型是:
BOOLEAN WINAPI GetPwrCapabilities(
__out PSYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities
);
其中用到的 SYSTEM_POWER_CAPABILITIES 结构定义为:
typedef struct { BOOLEAN PowerButtonPresent; BOOLEAN SleepButtonPresent; BOOLEAN LidPresent; BOOLEAN SystemS1; BOOLEAN SystemS2; BOOLEAN SystemS3; BOOLEAN SystemS4; BOOLEAN SystemS5; BOOLEAN HiberFilePresent; BOOLEAN FullWake; BOOLEAN VideoDimPresent; BOOLEAN ApmPresent; BOOLEAN UpsPresent; BOOLEAN ThermalControl; BOOLEAN ProcessorThrottle; BYTE ProcessorMinThrottle; BYTE ProcessorMaxThrottle; BOOLEAN FastSystemS4; BYTE spare2[3]; BOOLEAN DiskSpinDown; BYTE spare3[8]; BOOLEAN SystemBatteriesPresent; BOOLEAN BatteriesAreShortTerm; BATTERY_REPORTING_SCALE BatteryScale[3]; SYSTEM_POWER_STATE AcOnLineWake; SYSTEM_POWER_STATE SoftLidWake; SYSTEM_POWER_STATE RtcWake; SYSTEM_POWER_STATE MinDeviceWakeState; SYSTEM_POWER_STATE DefaultLowLatencyWake; } SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES; |
其中的 HiberFilePresent 成员就代表了系统已启动了休眠功能,而是否支持这些功能就要看其中的几个 SystemSx 成员的值,例如:
支持待机(SystrmS1-3),支持休眠(S4),支持软件关机(S5)
所以要判断是否已启用了休眠支持,可以这样写:
DECLARE Long GetPwrCapabilities IN PowrProf String @ lpSystemPowerCapabilities m.cSysPwrCap = REPLICATE( CHR(0), 128 ) GetPwrCapabilities( @ m.cSysPwrCap ) RETURN ( 0 != CTOBIN( SUBSTR( m.cSysPwrCap, 9, 1 ), '1rs' )) |
至于软关机嘛,对 ExitWindowsEx 函数的介绍实在是太多了,随处可见,不用多写。唯一要注意的就是在基于 NT 内核(NT,2000,XP,Vista)的系统中,调用进程必须拥有 SE_SHUTDOWN_NAME 权限, 这可以通过 AdjustTokenPrivileges 函数来设置。
打开/关闭监视器
----------------------------------------------------------------------------------------------
DECLARE Long SendMessage IN WIN32API Long, Long, Long, Long
SendMessage( _vfp.hWnd, 0x112, 0xf170, 1 ) && 关闭监视器
INKEY(0)
SendMessage( _vfp.hWnd, 0x112, 0xf170, -1 ) && 打开监视器