ผู้เขียน หัวข้อ: [VB6] การตั้งค่าเวลานับถอยหลังในการชัทดาวน์เครื่องคอมพิวเตอร์ด้วย WMI  (อ่าน 208 ครั้ง)

ออฟไลน์ ทองก้อน ทับทิมกรอบ

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
การตั้งค่าเวลานับถอยหลังในการชัทดาวน์เครื่องคอมพิวเตอร์ด้วย WMI หรือ (Windows Management Instrumentation) WMI เป็นเครื่องมือในการเข้าถึงองค์ประกอบ (Component) ของข้อมูลต่างๆระดับเชิงลึก ในระบบปฎิบัติการวินโดวส์ (Windows) ได้อย่างละเอียด มีประโยชน์มากมายในการนำมาใช้งาน

ดังตัวอย่างนี้ที่เราจะได้ศึกษาถึงวิธีการตั้งเวลานับเวลาถอยหลัง (Count down) โดยใช้ Timer Component เพื่อทำการชัทดาวน์เครื่องคอมพิวเตอร์ หรือจะสั่งให้ Log  off หรือ Restart ก็ยังได้เลยครับ นอกไปจากนี้ผมเพิ่มเติมเทคนิคของการปิดปุ่มกากบาท (Close) เพื่อไม่ให้สามารถกดได้ด้วยการใช้งาน API (Application Programming Interface) ...


โค้ดต้นฉบับ VB6


เริ่มต้นการสั่งนับเวลาถอยหลัง และปิดปุ่มกากบาทเอาไว้เพื่อให้กดได้


เมื่อเลือกการชัทดาวน์ ก็เริ่มต้นการนับเวลาถอยหลัง (ผมไม่ได้ใส่โค้ดในการซ่อนโปรเซสเอาไว้ให้ ต้องลองไปหาเองด้วยน่ะครับ)


ครบกำหนดจะชัทดาวน์ทันที

มาดูโค้ดกันเถอะ

ส่วนของการประกาศตัวแปรเพื่อให้ทุกๆส่วนของฟอร์มนี้มองเห็นหรือใช้งานได้หมด
โค๊ด: [Select]
Option Explicit
' ฟังค์ชั่น API ในการปิดปุ่มกากบาท
Private Declare Function GetSystemMenu Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal bRevert As Long) _
    As Long
Private Declare Function RemoveMenu Lib "user32" ( _
    ByVal hMenu As Long, _
    ByVal nPosition As Long, _
    ByVal wFlags As Long) _
    As Long
Private Const MF_BYPOSITION = &H400&
' / ----------------------------------------------------------------------------------------------------------------

' ค่าตัวแปรคงที่ในการเลือกโหมด
Private Const nLogOff = 0
Private Const nReboot = 2
Private Const nForceLogOff = 4
Private Const nForceReboot = 6
Private Const nPowerDown = 8
Private Const nForcePowerDown = 12
' ตัวแปรนับเวลานับถอยหลัง
Dim CountDown As Integer

โค้ดส่วนของการปิดกากบาท
โค๊ด: [Select]
' / ฟังค์ชั่นที่ช่วยในการปิดปุ่มกากบาท (X)
Private Sub DiableCloseForm(frm As Form)
    Dim hSysMenu As Long
    ' อ่านค่าฟอร์มด้วยฟังค์ชั่น GetSystemMenu
    hSysMenu = GetSystemMenu(frm.hwnd, 0)
    ' ให้ปุ่ม Close Program อยู่ในสถานะ Enabled = False หรือ กดไม่ได้นั่นเอง
    Call RemoveMenu(hSysMenu, 6, MF_BYPOSITION)
End Sub

โค้ดส่วนของการตั้งค่าต่างๆ
โค๊ด: [Select]
Private Sub Form_Load()
    ' ปิดการแสดงผลของตัวนับเวลาถอยหลัง
    lblCountDown.Visible = False
    Dim i As Integer
    ' ค่าเวลาตัวอย่าง
    For i = 10 To 100 Step 5
        cmbTime.AddItem i
    Next
    ' ตั้งค่า Default ตัวแรกที่ 10 วินาที
    cmbTime.ListIndex = 0
    ' ยังไม่ให้ Timer ทำงาน
    Timer1.Enabled = False
    Timer1.Interval = 1000  ' 1 Second
    ' การสั่งปิดปุ่มกากบาท
    Call DiableCloseForm(Me)    ' Me ก็คือฟอร์มตัวมันเองนั่นแหละ
End Sub

โค้ดส่วนของการยืนยันสั่งชัทดาวน์
โค๊ด: [Select]
Private Sub cmdOK_Click()
    ' ยืนยันการสั่ง Shutdown ด้วยเงื่อนไข
    If MsgBox("คุณแน่ใจว่าต้องการสั่งชัทดาวน์เครื่องตามเวลาที่ระบุไว้?", vbOKCancel + vbQuestion, "System Shut down") = vbOK Then
        ' นำค่าจาก ComboBox  ซึ่งเป็นค่า User Interface คูณด้วย 1000 ถึงจะได้เวลาจริงของโปรแกรม
        CountDown = Val(cmbTime.Text) * 1000
        ' Timer เริ่มต้นทำงาน
        Timer1.Enabled = True
        ' แสดงผลการนับถอยหลัง
        lblCountDown.Visible = True
        lblCountDown.Caption = Val(cmbTime.Text)
        ' ปิดการใช้งาน
        cmdOK.Enabled = False
        cmdExit.Enabled = False
        cmbTime.Enabled = False
    ' ยกเลิก
    Else
        MsgBox "ยกเลิกการชัทดาวน์", vbOKOnly + vbInformation, "System Shut down"
    End If
End Sub

ส่วนที่สำคัญในการนับเวลาถอยหลังและสั่งชัทดาวน์
โค๊ด: [Select]
' / ----------------------------------------------------------------------------------------------------------------
' / เริ่มต้นการทำงานในการนับเวลาถอยหลังที่นี่
Private Sub Timer1_Timer()
    ' เริ่มการลดค่าครั้งละ 1 วินาที (1000 millisecond)
    CountDown = CountDown - 1000
    ' ตรวจสอบการนับเวลาถอยหลัง
    If CountDown = 0 Then
        lblCountDown.Caption = ""
        ' ปิดการทำงานของ Timer
        Timer1.Enabled = False
       
        Dim objWMI As Object
        Dim osObj As Object
        Set objWMI = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem")
        For Each osObj In objWMI
            ' หากต้องการให้กระทำอย่างอื่น ขึ้นไปดูการประกาศตัวแปรคงที่ที่อยู่ทางด้านบนสุดน่ะครับ
            osObj.Win32Shutdown (nForcePowerDown)
        Next
        ' เพิ่มเติม: หาวิธีการซ่อนโปรเซส (Hidden Process) ด้วยการใช้ WMI กันเป็นโจทย์การบ้านน่ะครับ
        Unload Me
    ' นับเวลายังไม่ครบ
    Else
        lblCountDown.Caption = lblCountDown.Caption - 1
    End If
End Sub

ดาวน์โหลดโค้ดต้นฉบับ VB6 ที่นี่

บันทึกการเข้า
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
ขอบพระคุณมากครับผม..

บันทึกการเข้า

ออฟไลน์ naien

  • Newbie
  • *
  • กระทู้: 36
ขอบคุณมากครับ

บันทึกการเข้า

ออฟไลน์ ทองก้อน ทับทิมกรอบ

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet

บันทึกการเข้า
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด