デバイスの電源をオフにする

今回は、プログラムからデバイスの電源をオフにします。電源をオフにするのには2種類の方法があります。順にご紹介します。
ここでいう電源OFFは通常の携帯電話でいう所のサスペンド状態を指します。

電源OFFキーを押された事にして電源をオフにする

電源OFFキーを押下したという情報を、プログラムから伝えることによって電源をオフにします。Win32APIであるkeybd_event関数P/Invokeにて呼び出し、VK_OFFのキーコードを送出します。

VB.NET

   ' 以下の名前空間を指定しておいてください
   ' Imports System.Runtime.InteropServices
 
   Private ReadOnly VK_OFF As Byte = &HDF
   Private ReadOnly KEYEVENTF_KEYUP As Byte = &H2
 
   <DllImport("coredll.dll", SetLastError:=True)> _
   Shared Sub keybd_event(ByVal bVk As Byte, _
                          ByVal bScan As Byte, _
                          ByVal dwFlags As Integer, _
                          ByVal dwExtraInfo As Integer)
   End Sub
 
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 
       keybd_event(VK_OFF, 0, 0, 0)
       keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0)
 
   End Sub

C#

   // 以下の名前空間を指定しておいてください
   // using System.Runtime.InteropServices;  
 
   private readonly byte VK_OFF = 0xdf;
   private readonly byte KEYEVENTF_KEYUP = 0x2;
 
   [DllImport("coredll.dll", SetLastError = true)]
   public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
 
   private void Button1_Click(System.Object sender, System.EventArgs e)
   {
       keybd_event(VK_OFF, 0, 0, 0);
       keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);
   }

Win32APIのExitWindowsEx関数を使って電源をオフにする

Win32APIであるExitWindowsEx関数を、P/Invokeにて呼び出す事によって、システムをシャットダウンした後、電源を切ります。但し、システムにてパワーオフ機能をサポートしていなければなりません。 パワーオフ機能はStandard Editionのみのサポートとなっており、Classic/Professional Editionで実行すると、処理失敗の意味のfalseが返って来ます。

VB.NET

   ' 以下の名前空間を指定しておいてください
   ' Imports 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.PowerOff, 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.PowerOff, 0);
   }