Перезагрузите устройство Windows Mobile 6.x программно, используя C # - PullRequest
5 голосов
/ 09 августа 2010

Мой HTC HD2 не может быть перезагружен из ОС, просто выключите его. Поэтому я хочу написать небольшую программу для этого.

Можно ли программно перезагрузить устройство Windows Mobile 6.x с помощью C #?

Ответы [ 3 ]

6 голосов
/ 09 августа 2010

Вы должны использовать документированный 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);
}
5 голосов
/ 30 августа 2013

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);
    }
3 голосов
/ 09 августа 2010

Я думаю, что это поможет вам: Аппаратная перезагрузка устройства Windows Mobile .. Тем не менее этот метод не является «чистым кодом 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);
}

(хотя я сам не использовал этот метод ... см. здесь )

...