Option Strict Off
Option Explicit On

Imports System.Runtime.InteropServices

Friend Class Form1
        Inherits System.Windows.Forms.Form

    ' 休止/スタンバイする関数の宣言
    '   Hibernate       : 1 休止  0: スタンバイ
    '   ForceCritical   : 1 即時  0: 各APに通知-応答を待つ
    '   DisableWakeEvent: 1 全システムイベントを無効 WaitableTimerも停止! 注意
    '                     0 いくつかのイベントを有効
    <DllImport("Powrprof.dll", SetLastError:=True)> _
    Private Shared Function SetSuspendState( _
        ByVal Hibernate As Integer, _
        ByVal ForceCritical As Integer, _
        ByVal DisableWakeEvent As Integer) As Long
    End Function


    Private 予定時刻 As Date
    Private Op As Long   '処理種別




    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        '------------------
        ' 書式設定
        '------------------
        Me.Text = "指定時間後に休止/スタンバイ"

        Button1.Text = "休止"
        Button2.Text = "スタンバイ"
        Button3.Text = "中止"
        Button3.Enabled = False

        With Combo1
            .Font = VB6.FontChangeSize(.Font, 11) 'フォントサイズ
            .ImeMode = System.Windows.Forms.ImeMode.Off 'IMEモード:オフ
            .Items.Add(0) '時間リスト 0分
            .Items.Add(1) '1分
            .Items.Add(10) '10分
            .Items.Add(30) '30分
            .SelectedIndex = 0 '初期選択位置:0分
        End With

        With Label1
            .Font = VB6.FontChangeSize(.Font, 16)
            .TextAlign = System.Drawing.ContentAlignment.TopCenter
            .Text = ""
        End With
        With Timer1
            .Enabled = False '初期状態は無効
            .Interval = 1000 '周期:1秒
        End With
    End Sub

    '----------------------------
    ' 指定時間の入力チェック
    '----------------------------
    Private Sub Combo1_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) Handles Combo1.KeyPress
        Dim KeyAscii As Short = Asc(eventArgs.KeyChar)
        If (KeyAscii <> Asc(vbBack)) And (Not (Chr(KeyAscii) Like "[0-9]")) Then KeyAscii = 0 '0〜9以外は不許可
        eventArgs.KeyChar = Chr(KeyAscii)
        If KeyAscii = 0 Then
            eventArgs.Handled = True
        End If
    End Sub

    Private Sub Combo1_Validating(ByVal eventSender As System.Object, ByVal eventArgs As System.ComponentModel.CancelEventArgs) Handles Combo1.Validating
        Dim Cancel As Boolean = eventArgs.Cancel
        If Combo1.Text = "" Then
            MsgBox("指定時間:空白は無効")
            Cancel = True '空白は不許可
        End If
        eventArgs.Cancel = Cancel
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call Go(1)
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Call Go(0)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer1.Enabled = False   'タイマー停止
        Label1.Text = ""
        Button1.Enabled = True
        Button2.Enabled = True
        Button3.Enabled = False
    End Sub

    Private Sub Go(ByVal Param As Integer)

        Op = Param    '処理種別

        Label1.ForeColor = System.Drawing.Color.Black '表示色=黒
        Timer1.Enabled = True
        If Val(Combo1.Text) = 0 Then '指定時間が0なら
            予定時刻 = System.DateTime.FromOADate(Now.ToOADate + TimeSerial(0, 0, 5).ToOADate) '5秒前から
        Else
            予定時刻 = System.DateTime.FromOADate(Now.ToOADate + TimeSerial(0, Val(Combo1.Text), 0).ToOADate) 'そのまま
        End If

        Button1.Enabled = False
        Button2.Enabled = False
        Button3.Enabled = True

    End Sub


    Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick

        Dim t As TimeSpan '残り時間

        t = New TimeSpan(0, 0, (予定時刻 - Now()).TotalSeconds) '秒単位(ミリ秒は表示しない)
        Label1.Text = t.ToString
        Select Case t.TotalSeconds
            Case Is <= 0 '時間=0
                '-------------------
                ' 処理実行
                '-------------------
                Call SetSuspendState(Op, 1, 0)   '強制
                End '終了
            Case Is <= 10 '10秒以内
                Label1.ForeColor = System.Drawing.Color.Red '表示色=赤
                Beep() 'カウントダウン音
            Case Else

        End Select

    End Sub


End Class