Respuesta

6

Se debe utilizar la API ExitWindowsEx documentado. IOCTL solo se debe utilizar en plataformas que carecen de la llamada a la función ExitWindowsEx (Pocket PC 2000, 2002 y 2003). Vea el MSDN doc para más información.

[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); 
} 
+0

¡Muchas gracias! Por cierto, ¿qué opinas sobre 'SetSystemPowerState' que se encuentra aquí: http://www.krvarma.com/windows-mobile/how-to-soft-reset-windows-mobile-programmatically/ – abatishchev

+1

Parece un reemplazo válido para ExitWindowsEx . SetSystemPowerState es más versátil y es compatible con plataformas anteriores a ExitWindowsEx. SetSystemPowerState parece ser la función que debe usar si se dirige a Windows CE o una combinación de dispositivos con Windows CE y Pocket PC y Windows Mobile. –

+0

+1 Genial, gracias – Tim

3

Creo que esto te ayudará: Hard Reset Windows Mobile Device ..Sin embargo, este método no es "claro código C#", porque utiliza Interop, pero funciona, por lo que puede resolver su problema.
Para suave reinicio:

[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); 
} 

(aunque no he utilizado este método myself..see here)

+0

tengo que hacer restablecimiento parcial, es decir, solo reinicie. Hard reset restablece el dispositivo a los valores predeterminados – abatishchev

+0

.. Código agregado para restablecimiento suave también .. – 0x49D1

+0

Este código funciona bien en Motorola Symbol Micro Kiosk MK500. –

4

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 
    ); 

    /// <summary> 
    /// Causes the CE device to soft/warm reset 
    /// </summary> 
    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); 
    } 
Cuestiones relacionadas