酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Mobile(.NET Compact Framework)でデバイスを再起動(ソフトリセット)する

Windows Mobileでは2種類の「リセット」があります。デバイスの再起動を行う為の「ソフトリセット」、工場出荷状態に戻すための「ハードリセット」です。

ハードリセットの方法に関しては、「Windows Mobile(.NET Compact Framework)でデバイスを工場出荷時状態に戻す(ハードリセットをおこなう) - 酢ろぐ!」にて紹介していますので必要であればご参照ください。

今回は、デバイスの再起動を行う「ソフトリセット」のご紹介です。

ExitWindowsEx関数を使ったソフトリセット

Win32APIであるExitWindowsEx関数を、P/Invokeにて呼び出す事によってデバイスの再起動(ソフトリセット)します。

VB.NET

   ' 以下の名前空間を指定しておいてください
   ' using System.Runtime.InteropServices;  
   
   <Flags()> _
   Enum ExitWindows As Integer
       Reboot = &H2
       PowerOff = &H8
   End Enum
   
   <DllImport("aygshell.dll", SetLastError:=True)> _
   Shared Function ExitWindowsEx(ByVal uFlags As ExitWindows, _
                                 ByVal dwReason As Integer) _
                                 As <MarshalAs(UnmanagedType.Bool)> Boolean
   End Function
   
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
   
       ' デバイスを再起動(ソフトリセット)する
       Dim isSuccess As Boolean = ExitWindowsEx(ExitWindows.Reboot, 0)
   
   End Sub

C#

   // 以下の名前空間を指定しておいてください
   // using System.Runtime.InteropServices;  
   
   [Flags()]
   enum ExitWindows : int
   {
       Reboot = 0x2,
       PowerOff = 0x8
   }
   
   [DllImport("aygshell.dll", SetLastError = true)]
   [return: MarshalAs(UnmanagedType.Bool)]
   public static extern bool ExitWindowsEx(ExitWindows uFlags, int dwReason);
   
   private void Button1_Click(System.Object sender, System.EventArgs e)
   {
       // デバイスを再起動(ソフトリセット)する
       bool isSuccess = ExitWindowsEx(ExitWindows.Reboot, 0);
   }

KernelIoControl関数を使ったソフトリセット

C#

  [System.Runtime.InteropServices.DllImport("Coredll.dll")]
  extern static int KernelIoControl(int dwIoControlCode, 
                                    IntPtr lpInBuf, 
                                    int nInBufSize, 
                                    IntPtr lpOutBuf, 
                                    int nOutBufSize , 
                                    ref int lpBytesReturned );

  public void Reboot()
  {
     int IOCTL_HAL_REBOOT = 0x101003C;
     int bytesReturned = 0;

     KernelIoControl(IOCTL_HAL_REBOOT, 
                     IntPtr.Zero, 0, 
                     IntPtr.Zero, 0, ref bytesReturned );
  }

関連記事

Windows Mobile(.NET Compact Framework)を使ってアプリ開発する際に逆引きとしてお使いください。