使用C#以编程方式重新启动Windows Mobile 6.x设备

我的HTC HD2无法从操作系统重启,只需关机即可。 所以我想写一个小程序来做到这一点。

是否可以使用C#以编程方式重新启动Windows Mobile 6.x设备?

您应该使用记录的ExitWindowsEx API。 IOCTL应仅用于缺少ExitWindowsEx函数调用的平台(Pocket PC 2000,2002和2003)。 有关更多信息,请参阅MSDN文档 。

 [DllImport("aygshell.dll", SetLastError=""true"")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ExitWindowsEx([MarshalAs(UnmanagedType.U4)]uint dwFlags, [MarshalAs(UnmanagedType.U4)]uint dwReserved); enum ExitWindowsAction : uint { EWX_LOGOFF = 0, EWX_SHUTDOWN = 1, EWX_REBOOT = 2, EWX_FORCE = 4, EWX_POWEROFF = 8 } void rebootDevice() { ExitWindowsEx(ExitWindowsAction.EWX_REBOOT, 0); } 

SOFTRESET / HARDRESET

 public class Reboot { public const uint FILE_DEVICE_HAL = 0x00000101; public const uint METHOD_BUFFERED = 0; public const uint FILE_ANY_ACCESS = 0; public static uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access) { return ((DeviceType << 16) | (Access << 14) | (Function << 2) | Method); } [DllImport("Coredll.dll")] public extern static uint KernelIoControl ( uint dwIoControlCode, IntPtr lpInBuf, uint nInBufSize, IntPtr lpOutBuf, uint nOutBufSize, ref uint lpBytesReturned ); ///  /// Causes the CE device to soft/warm reset ///  public static uint SoftReset() { uint bytesReturned = 0; uint IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS); SetCleanRebootFlag(); return KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned); } [DllImport("coredll.dll")] public extern static uint SetSystemPowerState ( String psState, Int32 StateFlags, Int32 Options ); const int POWER_FORCE = 4096; const int POWER_STATE_RESET = 0x00800000; public static uint ColdReset() { SetCleanRebootFlag(); return SetSystemPowerState(null, POWER_STATE_RESET, POWER_FORCE); } [DllImport("Coredll.dll")] public extern static int KernelIoControl(int dwIoControlCode, IntPtr lpInBuf, int nInBufSize, IntPtr lpOutBuf, int nOutBufSize, ref int lpBytesReturned); [DllImport("Coredll.dll")] public extern static void SetCleanRebootFlag(); public static void HardReset() { int IOCTL_HAL_REBOOT = 0x101003C; int bytesReturned = 0; SetCleanRebootFlag(); KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned); } [DllImport("aygshell.dll", SetLastError=true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ExitWindowsEx([MarshalAs(UnmanagedType.U4)]uint dwFlags, [MarshalAs(UnmanagedType.U4)]uint dwReserved); enum ExitWindowsAction : uint { EWX_LOGOFF = 0, EWX_SHUTDOWN = 1, EWX_REBOOT = 2, EWX_FORCE = 4, EWX_POWEROFF = 8 } // void rebootDevice() { ExitWindowsEx(ExitWindowsAction.EWX_REBOOT, 0); } 

我认为这会对你有所帮助: 硬重置Windows移动设备 ..但这种方法不是“清除c#代码”,因为它使用Interop,但它有效,所以它可以解决你的问题。
对于复位:

 [DllImport("coredll.dll", SetLastError=true)] private static extern bool KernelIoControl(int dwIoControlCode, byte[] inBuf, int inBufSize, byte[] outBuf, int outBufSize, ref int bytesReturned); private const uint FILE_DEVICE_HAL = 0x00000101; private const uint METHOD_BUFFERED = 0; private const uint FILE_ANY_ACCESS = 0; private static uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access) { return ((DeviceType << 16) | (Access << 14) | (Function << 2) | Method); } public static void softReset() { uint bytesReturned = 0; uint IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS); KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned); } 

(我自己没有用过这种方法..请到这里 )

Interesting Posts