嵌入式操作系统Windows CE和微软的桌面操作系统,譬如windows xp,windows7等相比较,在系统重启与关机方面是明显不同的。在一般的桌面操作系统中,通过开始菜单即可完成系统的睡眠、重启和关机等操作,但是在Windows CE中,只有一个Suspend(挂起)选项,如果想要实现重启关机操作的话,就需要自己写一个应用程序了。
不过在网上查到的最多的一个方法用我的设备测试是行不通的,至于原因我还没有搞明白,代码如下:
#include <windows.h>
#include "winioctl.h"
BOOL KernelIoControl(DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned);
#define IOCTL_HAL_GET_DEVICE_INFO CTL_CODE(FILE_DEVICE_HAL, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_COLDBOOT CTL_CODE(FILE_DEVICE_HAL, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
void WINAPI Reboot (int nBootMode)
{
int inVal; BYTE outBuf[1024];
DWORD bytesReturned; //KernelIoControl(IOCTL_HAL_COLDBOOT, &inVal, 4, outBuf, 1024, &bytesReturned);
if(nBootMode == 0)
KernelIoControl(IOCTL_HAL_REBOOT, &inVal, 4, outBuf, 1024, &bytesReturned); //热启动
else KernelIoControl(IOCTL_HAL_COLDBOOT, &inVal, 4, outBuf, 1024, &bytesReturned); //冷启动
}
上述代码的思想是通过KerneIoControl函数来实现Windows CE的重启,只是在我的设备上没有起到应有的效果,或者还需要增加某些代码,亦或者需要在定制Windows CE的时候增加某些选项,这就不得而知了。如果以后可以通过上述代码的思想实现重启,我再说明下方法。
但是问题是需要解决的,所以我从网上查在桌面操作系统下应该如何通过编程来实现重启,然后查到了ExitWindowsEX函数,然而很可惜的是,也是行不通的,当调用这个函数的时候,VS提示找不到该函数。
经过上述两次的尝试,我又换了一个思路:记得当时在定制wince的时候,有个电源管理选项,不知道系统的重启关机是否和电源选项有关,因此便从网上查电源管理,找了一个函数SetSystemPowerState,于是尝试了一下,结果是可喜的,成功了。
该函数的原型为:
DWORD SetSystemPowerState( LPCWSTR psState, DWORD StateFlags, DWORD Options );
根据MSDN,该函数只在windows CE中才可以使用。
在调用这个函数的时候,首先引用头文件pm.h,在这个文件中,可以找到函数原型中第二个参数StatFlags的相关取值:
#define POWER_STATE(f) ((f) & 0xFFFF0000) // power state mask
#define POWER_STATE_ON (DWORD)(0x00010000) // on state
#define POWER_STATE_OFF (DWORD)(0x00020000) // no power, full off
#define POWER_STATE_CRITICAL (DWORD)(0x00040000) // critical off
#define POWER_STATE_BOOT (DWORD)(0x00080000) // boot state
#define POWER_STATE_IDLE (DWORD)(0x00100000) // idle state
#define POWER_STATE_SUSPEND (DWORD)(0x00200000) // suspend state
#define POWER_STATE_UNATTENDED (DWORD)(0x00400000) // Unattended state.
#define POWER_STATE_RESET (DWORD)(0x00800000) // reset state
#define POWER_STATE_USERIDLE (DWORD)(0x01000000) // user idle state
#define POWER_STATE_BACKLIGHTON (DWORD)(0x02000000) // device scree backlight on
#define POWER_STATE_PASSWORD (DWORD)(0x10000000) // This state is password protected.
通过如下语句即可实现系统重启:
SetSystemPowerState(NULL,POWER_STATE_RESET,POWER_FORCE);