酢ろぐ!

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

Windows Mobile(.NET Compact Framework)でデバイスの電源をオフにする

今回は、プログラムからデバイスの電源をオフにします。電源をオフにするのには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);
}

関連記事

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