WMI หรือ Windows Management Instrumentation เป็นตัวจัดการโครงสร้างข้อมูลพื้นฐานและการดำเนินงานต่าง ๆ ภายใต้ระบบบฎิบัติการวินโดวส์ หรือเรียกง่ายๆ มันคือคลาสที่ใช้จัดการทุกเรื่องของวินโดวส์ สำหรับบทความนี้จะนำเสนอเสี้ยวหนึ่งของ WMI ที่เกี่ยวข้องกับ WIN32 โดยจะยกตัวอย่างโปรแกรม แสดงรายละเอียดต่าง ๆ ของระบบปฎิบัติการ และคอมพิวเตอร์ (hardware)
1. เปิด Visual Studio 20xx จากนั้นคลิกเลือก New Project....
เลือก Visual Basic -> Windows -> Windows Forms Application
ที่ช่อง Name ป้อน mySysInfo
2. จากนั้นให้เพิ่มคอนโทรล Button กับ Textbox ลงใน Form1 ดังภาพ
3. จากนั้นทำการเพิ่ม Reference สำหรับ WMI โดยไปที่เมนู Project -> Add Reference...
จะปรากฎหน้าจอดังภาพด้านล่าง
ให้เลือก System.Management แล้วคลิกปุ่ม OK
4. ทำการสร้างคลาส โดยไปที่เมนู Project -> Add New Item...จากนั้นคลิกเลือก Class ที่ช่อง Name ป้อนชื่อโปรแกรม myWMI.vb
5. ที่หน้าจอเขียนโปรแกรม myWMI.vb ให้ป้อนคำสั่งตามตัวอย่างด้านล่าง
Imports System.Management
Public Class myWMI
Private objOS As ManagementObjectSearcher
Private objCS As ManagementObjectSearcher
Private m_strComputerName As String
Private m_strManufacturer As String
Private m_StrModel As String
Private m_strOSName As String
Private m_strOSVersion As String
Private m_strSystemType As String
Private m_strTPM As String
Private m_strWindowsDir As String
Public Sub New()
Dim objMgmt As ManagementObject
objOS = New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
objCS = New ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")
For Each objMgmt In objOS.Get
m_strOSName = objMgmt("name").ToString()
m_strOSVersion = objMgmt("version").ToString()
m_strComputerName = objMgmt("csname").ToString()
m_strWindowsDir = objMgmt("windowsdirectory").ToString()
Next
For Each objMgmt In objCS.Get
m_strManufacturer = objMgmt("manufacturer").ToString()
m_StrModel = objMgmt("model").ToString()
m_strSystemType = objMgmt("systemtype").ToString
m_strTPM = objMgmt("totalphysicalmemory").ToString()
Next
End Sub
Public ReadOnly Property ComputerName()
Get
ComputerName = m_strComputerName
End Get
End Property
Public ReadOnly Property Manufacturer()
Get
Manufacturer = m_strManufacturer
End Get
End Property
Public ReadOnly Property Model()
Get
Model = m_StrModel
End Get
End Property
Public ReadOnly Property OsName()
Get
OsName = m_strOSName
End Get
End Property
Public ReadOnly Property OSVersion()
Get
OSVersion = m_strOSVersion
End Get
End Property
Public ReadOnly Property SystemType()
Get
SystemType = m_strSystemType
End Get
End Property
Public ReadOnly Property TotalPhysicalMemory()
Get
TotalPhysicalMemory = m_strTPM
End Get
End Property
Public ReadOnly Property WindowsDirectory()
Get
WindowsDirectory = m_strWindowsDir
End Get
End Property
End Class
6. จากนั้นย้อนกลับไปยังหน้าจอ Form1 ให้ Double Click ที่ปุ่ม Button1 เพื่อเข้าไปเขียนคำสั่ง จากนั้นให้ป้อนคำสั่งดังนี้
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim SHOW_SPEC As New myWMI
With SHOW_SPEC
TextBox1.Text = "COMPUTER NAME : " & .ComputerName & vbCrLf & _
"MODEL : " & .Model & vbCrLf & _
"MANUFACTURER : " & .Manufacturer & vbCrLf & _
"SYSTEM TYPE : " & .SystemType & vbCrLf & _
"OS : " & .OsName & vbCrLf & _
"OS VERSION : " & .OSVersion & vbCrLf & _
"WINDOWS DIRECTORY : " & .WindowsDirectory & vbCrLf & _
"TOTAL MEMORY : " & .TotalPhysicalMemory
End With
End Sub
End Class
7. ทำการบันทึกแล้วกดปุ่ม F5 เพื่อสั่งรันโปรแกรม จะปรากฎฟอร์ม ให้คลิกปุ่ม Button1 จะแสดงรายละเอียดของเครื่องลักษณะดังภาพ
จริง ๆ รายละเอียดต่าง ๆ ที่แสดงอยู่ ยังไม่หมดเพียงเท่านี้ ผู้อ่านสามารถแสดงสิ่งต่าง ๆ ได้อีกมากมาย อยากรู้ให้คลิกเข้าไปดูที่ WMI Classes -> Win32 Classes
http://msdn.microsoft.com/en-us/library/aa394084%28v=VS.85%29.aspx
... อย่าเพิ่งเกาหัว และก็อย่าเพิ่งถามว่า แล้วจะใช้อย่างไร.... คำตอบมีอยู่ด้านล่างนี้แหละ
ย้อนกลับไปข้อ 5 ยังจำได้ไหมว่าเราได้สร้างคลาส myWMI.vb ดังนี้
Imports System.Management
Public Class myWMI
Private objOS As ManagementObjectSearcher ' ตัวแปร objOS สำหรับเก็บค่า OS
....
มีการสร้าง ตัวแปร property ด้วยคำสั่ง
Private m_strComputerName As String ' ตัวแปรสำหรับใช้ใน proerty ชือ ComputerName
Private m_strManufacturer As String ' ตัวแปรสำหรับใช้ใน proerty ชือ Manufacturer
.....
แล้วก็สร้าง property แบบ อ่านได้อย่างเดียวตามตัวแปรที่กำหนด
Public ReadOnly Property ComputerName()
Get
ComputerName = m_strComputerName ' ตัวแปร property ที่กำหนดไว้ก่อนหน้า
End Get
End Property
Public ReadOnly Property Manufacturer()
Get
Manufacturer = m_strManufacturer ' ตัวแปร property ที่กำหนดไว้ก่อนหน้า
End Get
End Property
จากนั้นมีการสร้าง Constructors เพื่ออ่านค่าของ WIN32 Class ที่เราต้องการ เช่น คลาส Win32_OperatingSystem
??? แล้ว Constructors มันคืออะไร มันคือ Sub New() .... End Sub
??? แล้ว Constructors เอาไว้ทำอะไร Sub New จะทำงานเองโดยอัตโนมัติเมื่อมีการสร้างวัตถุขึ้นมาจากคลาส เช่น
Dim SHOW_SPEC As New myWMI
จากคำสั่งข้างต้น Sub New()....End Sub หรือ Constructors มันจะทำงานอัตโนมัติ (ถ้ามองให้ดี ๆ คล้าย ๆ กับ Form -> Load ที่เกิดขึ้นอัตโนมัติตอนเปิดฟอร์ม)
ดังนั้น เมื่อเราต้องการดึงค่า WIN32_OperatingSystem หรือค่า WIN32 อื่น ๆ เราจึงต้องทำใน Constructors นี้ .... เข้าใจหรือยังครับ....
จากตัวอย่าง
Public Sub New()
Dim objMgmt As ManagementObject
objOS = New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
objCS = New ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")
For Each objMgmt In objOS.Get
m_strOSName = objMgmt("name").ToString()
m_strOSVersion = objMgmt("version").ToString()
m_strComputerName = objMgmt("csname").ToString()
m_strWindowsDir = objMgmt("windowsdirectory").ToString()
Next
.....
.....
End Sub
คำสั่งข้างต้นจะมีการอ่านค่าแล้วมาเก็บไว้ใน property ที่สร้างเตรียมไว้แล้ว
แล้ว SELECT * FROM Win32_OperatingSystem มาได้อย่างไร
จริงๆ มันคือการคิวรี ค่าจากคลาส Win32 ในส่วนของ OperatingSystem
แล้วถ้าเป็นคลาสอื่นล่ะจะไปหามาจากไหนได้อย่างไร
หาไม่ยาก ก็อยู่ใน MSDN ของ Microsoft ที่ผู้เขียนแสดงชื่อ web ไว้ให้แล้ว
เช่น เราต้องการดู BIOS จะทำอย่างไร ก็เข้าไปที่ MSDN ของ Microsoft ในส่วนของ Win32_BIOS
http://msdn.microsoft.com/en-us/library/aa394077%28v=VS.85%29.aspx
คลิกแล้วจะแสดงหน้าตาดังภาพ
ถ้าเราต้องการดู SerialNumber ของ BIOS ตามลูกศรชี เราจะต้อง
1. สร้างตัวแปรสำหรับเก็บค่าของคิวรี SELECT ...
Private objBIOS As ManagementObjectSearcher
จากนั้นก็สั่งคิวรีข้อมูลจาก คลาส Win32_BIOS ชื่อจะตรงกับคลาสที่เราเปิดดูใน MSDN
objBIOS = New ManagementObjectSearcher("SELECT * FROM Win32_BIOS")
2. สร้างตัวแปร property ดังนี้
Private m_strBIOSSerialNumber As String ' ประเภทของข้อมูลต้องตรงกัน
3. อ่านค่าจาก objBIOS ซึ่งได้คิวรีข้อมูลมาจาก Win32_BIOS
For Each objMgmt In objBIOS.Get
m_strBIOSSerialNumber = objMgmt("SerialNumber").ToString()
Next
' SerialNumber ชื่อจะตรงกับค่าที่แสดงอยู่ใน MSDN
4. สร้าง property ดังนี้
Public ReadOnly Property BIOSSerialNumber()
Get
BIOSSerialNumber = m_strBIOSSerialNumber
End Get
End Property
มาถึงตรงนี้เราคงได้วิธีทำอะไรอื่น ๆ อีกมากมาย
ถ้าอยากรู้ Serial Number ของ Harddisk ก็ไม่ยากแล้วใช่หรือไม่ ....
อยากรู้อะไร WIN32 ทำได้หมด ถามถึงหวย ก็บอกได้จะเอาเบอร์อะไร
:-p
21 มกราคม 2554
09 มกราคม 2554
เรียนภาษาอังกฤษ กับ Voice of America (VOA)
แนะนำ เว็บเรียนภาษาอังกฤษ จากเจ้าของภาษา ที่
http://www.voanews.com/learningenglish/theclassroom/activities/
http://www.voanews.com/learningenglish/theclassroom/activities/
07 มกราคม 2554
VB.Net Game BINGO พูดได้นะจะบอกให้
Game BINGO เป็นตัวอย่างของโปรเจกต์ ที่ผู้เขียนไม่ได้ตั้งใจนำเสนอการเขียนเกมส์หรอก จริง ๆ ต้องการนำเสนอวิธีการสร้างออปเจกต์ ขณะรันโปรแกรม (Runtime) ซึ่งปกติเราจะใช้วิธีลาก คอนโทรลของ .Net มาวาง ๆ ๆ บนฟอร์มที่เราสร้างขึ้น
แต่ในบางครั้งเราจำเป็นต้องสร้างออปเจกต์ แบบอัตโนมัติ พร้อมทั้งสามารถเชื่อมโยงไปยัง เหตุการณ์ (event) ที่เราต้องการ โดยผ่านคำสั่ง เช่น
AddHandler btnNew.MouseClick, AddressOf btnNew_Click
แล้วก็มีเรื่องของการอ้าง property ในแบบอาศัยตัวแปรแทนชื่อที่กำหนดไว้ เช่น
Me.Controls("Label" & RandomNumber.ToString).Enabled = False
แถมด้วย คำสั่งที่ใช้ออกเสียงภาษาอังกฤษ โดยอาศัย API ชื่อ SAPI (S น่าจะมาจาก Speech + กับ API) มาช่วย
และอื่น ๆ อีกมากมายจากโค้ดตัวอย่างต่อไปนี้ ลองทำดู แล้วจะรู้ว่าคุณทำได้
1. สร้าง Project เป็น Windows Form Application ขึ้นมา 1 ตัว ชื่อ BINGO ดังภาพด้านล่าง

2. ที่ Form1 ให้ คลิกเมาส์ที่ฟอร์ม เร็ว ๆ สองที (double-click Mouse) จะเข้าสู่หน้าต่าง เขียนคำสั่ง ให้นำคำสั่งด้านล่างนี้ไปแทนที่ได้เลย
เผื่อเปิดโต๊ะแข่ง กับ Bingo ตามงานวัด
แต่ในบางครั้งเราจำเป็นต้องสร้างออปเจกต์ แบบอัตโนมัติ พร้อมทั้งสามารถเชื่อมโยงไปยัง เหตุการณ์ (event) ที่เราต้องการ โดยผ่านคำสั่ง เช่น
AddHandler btnNew.MouseClick, AddressOf btnNew_Click
แล้วก็มีเรื่องของการอ้าง property ในแบบอาศัยตัวแปรแทนชื่อที่กำหนดไว้ เช่น
Me.Controls("Label" & RandomNumber.ToString).Enabled = False
แถมด้วย คำสั่งที่ใช้ออกเสียงภาษาอังกฤษ โดยอาศัย API ชื่อ SAPI (S น่าจะมาจาก Speech + กับ API) มาช่วย
และอื่น ๆ อีกมากมายจากโค้ดตัวอย่างต่อไปนี้ ลองทำดู แล้วจะรู้ว่าคุณทำได้
1. สร้าง Project เป็น Windows Form Application ขึ้นมา 1 ตัว ชื่อ BINGO ดังภาพด้านล่าง

2. ที่ Form1 ให้ คลิกเมาส์ที่ฟอร์ม เร็ว ๆ สองที (double-click Mouse) จะเข้าสู่หน้าต่าง เขียนคำสั่ง ให้นำคำสั่งด้านล่างนี้ไปแทนที่ได้เลย
Public Class Form1
Private lblNumber As New Label
Private lblCounter As New Label
Private btnRandom As New Button
Private btnNew As New Button
Private totLbl As Integer = 49
Private aNewlbl(totLbl) As Label
Private nTime As Integer = 0
Private nCounter As Integer = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'
'Form
'
Me.Text = "BINGO"
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(653, 414)
'
'lblNumber
'
lblNumber.BackColor = System.Drawing.SystemColors.ActiveCaption
lblNumber.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
lblNumber.Font = New System.Drawing.Font("Microsoft Sans Serif", 72.0!, _
System.Drawing.FontStyle.Bold, _
System.Drawing.GraphicsUnit.Point, _
CType(222, Byte))
lblNumber.ForeColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), _
CType(CType(0, Byte), Integer), _
CType(CType(0, Byte), Integer))
lblNumber.Location = New System.Drawing.Point(10, 272)
lblNumber.Name = "lblNumber"
lblNumber.Size = New System.Drawing.Size(490, 106)
lblNumber.Text = "B I N G O"
lblNumber.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Controls.Add(lblNumber)
'
'lblCounter
'
lblCounter.BackColor = System.Drawing.SystemColors.ActiveCaption
lblCounter.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
lblCounter.Font = New System.Drawing.Font("Microsoft Sans Serif", 36.0!, _
System.Drawing.FontStyle.Bold, _
System.Drawing.GraphicsUnit.Point, _
CType(222, Byte))
lblCounter.ForeColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), _
CType(CType(0, Byte), Integer), _
CType(CType(0, Byte), Integer))
lblCounter.Location = New System.Drawing.Point(522, 272)
lblCounter.Name = "lblCounter"
lblCounter.Size = New System.Drawing.Size(109, 63)
lblCounter.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.Controls.Add(lblCounter)
'
'btnRandom
'
btnRandom.Font = New System.Drawing.Font("Microsoft Sans Serif", 16.0!, _
System.Drawing.FontStyle.Regular, _
System.Drawing.GraphicsUnit.Point, _
CType(222, Byte))
btnRandom.Location = New System.Drawing.Point(508, 18)
btnRandom.Name = "btnRandom"
btnRandom.Size = New System.Drawing.Size(137, 39)
btnRandom.Text = "Random"
btnRandom.UseVisualStyleBackColor = True
AddHandler btnRandom.MouseClick, AddressOf btnRandom_Click
Me.Controls.Add(btnRandom)
'
'btnNew
'
btnNew.Font = New System.Drawing.Font("Microsoft Sans Serif", 16.0!, _
System.Drawing.FontStyle.Regular, _
System.Drawing.GraphicsUnit.Point, _
CType(222, Byte))
btnNew.Location = New System.Drawing.Point(508, 67)
btnNew.Name = "Button2"
btnNew.Size = New System.Drawing.Size(137, 39)
btnNew.Text = "New Game"
btnNew.UseVisualStyleBackColor = True
AddHandler btnNew.MouseClick, AddressOf btnNew_Click
Me.Controls.Add(btnNew)
'
'Label
'
Dim tt As Integer = 10
For i As Integer = 0 To totLbl
aNewlbl(i) = New Label With {.Name = "Label" & CType(i + 1, String).Trim, _
.Text = CType(i + 1, String).Trim, _
.Location = New Point(CType(((i Mod 10) * 50) + 10, Integer), CType(tt, Integer)), _
.Size = New Size(40, 40), _
.Font = New System.Drawing.Font("Microsoft Sans Serif", _
16.0!, System.Drawing.FontStyle.Bold, _
System.Drawing.GraphicsUnit.Point, _
CType(222, Byte)), _
.TextAlign = System.Drawing.ContentAlignment.MiddleCenter, _
.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle, _
.BackColor = Color.Azure}
If i Mod 10 = 9 Then
tt = tt + 50
End If
Me.Controls.Add(aNewlbl(i))
Next i
End Sub
Private Sub btnRandom_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
btnRandom.Enabled = False
btnNew.Enabled = False
nCounter = nCounter + 1
RandomNumber()
btnRandom.Enabled = True
btnNew.Enabled = True
End Sub
Private Sub btnNew_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
'Reset
nCounter = 0
lblCounter.Text = ""
lblNumber.Text = "B I N G O"
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is Label Then
If ctrl.Name <> "lblNumber" And ctrl.Name <> "lblCounter" Then
ctrl.BackColor = Color.Azure
ctrl.Enabled = True
End If
End If
Next
PlaySound("lET'S START BINGO")
End Sub
Private Sub RandomNumber()
Dim RandomClass As New Random()
Dim RandomNumber As Integer
If nCounter <= 50 Then
'Create a new Random class in VB.NET
Do While True
RandomNumber = RandomClass.Next(1, 51)
If Me.Controls("Label" & RandomNumber.ToString).Enabled = True Then
Exit Do
End If
Loop
Else
MessageBox.Show("Complete BINGO")
Return
End If
lblCounter.Text = nCounter.ToString
lblNumber.Text = RandomNumber.ToString
PlaySound("Number " & lblNumber.Text)
Me.Controls("Label" & RandomNumber.ToString).Enabled = False
Me.Controls("Label" & RandomNumber.ToString).BackColor = Color.Red
If nCounter >= 50 Then
MessageBox.Show("B I N G O Complete !!!!", "BINGO", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
Private Sub PlaySound(ByVal Word As String)
Dim SAPI
SAPI = CreateObject("SAPI.spvoice")
SAPI.speak(Word)
End Sub
End Class
แล้วลอง Run โปรเจกต์ดู จะปรากรฎหน้าตาโปรแกรม คล้าย ๆ แบบนี้ ลองเล่นดู อิๆๆเผื่อเปิดโต๊ะแข่ง กับ Bingo ตามงานวัด
สมัครสมาชิก:
ความคิดเห็น (Atom)
"I Believe in You"





