thongkorn โพสต์ 2018-9-4 11:04:56

[VB6/VB.NET] การแสดงรายชื่อเครื่องพิมพ์ และสถานะด้วยการใช้งาน WMI

http://www.g2gnet.com/webboard/images/vbnet/WMIListPrinter.png


สำหรับบทความนี้จะมีโค้ดทั้ง VB6 และ VB.Net เพราะใช้กระบวนคิดแบบเดียวกันหมด แตกต่างแค่คำสั่งที่ใช้งานเท่านั้น โดยใช้งานติดต่อผ่านทาง WMI หรือ Windows Management Instrumentation แอดมินเตรียมเอาไว้สำหรับโปรเจคใหม่ ซึ่งโปรแกรมตัวเดียวจะต้องส่งพิมพ์งานออกทางหลายเครื่องพิมพ์ ขึ้นอยู่กับลักษณะของงานนั้นๆ และเพืออำนวยความสะดวกให้กับผู้ใช้งาน รายละเอียดมันมีเยอะ แอดมินตัดมาให้ได้รับชมในส่วนสำคัญๆ เช่น การตรวจสอบสถานะของเครื่องพิมพ์ เรียนรู้ศึกษารายละเอียดเพิ่มเติมเกี่ยวกับ Win32_Printer class (สำคัญและจำเป็นมาก) ...

แนะนำการใช้งานและดาวน์โหลด WMI Code Creator Tool


http://www.g2gnet.com/webboard/images/vbnet/WMIReference.png
กรณี VB.Net จะต้องเลือก References คือ System.Management


มาดูโค้ดในส่วนของ VB.NET (2010)
' / --------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' / Purpose: Listing printer with WMI.
' / Microsoft Visual Basic .NET (2010)
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------------

Imports System.Management
Public Class frmListPrinter

    ' / ตั้งค่า ListView Control
    Sub InitListView()
      '/ Initialize ListView Control
      With lvwData
            .View = View.Details
            .GridLines = True
            .FullRowSelect = True
            .HideSelection = False
            .MultiSelect = False
            '/ ใช้ทั้งหมด 3 หลัก โดยหลักแรก มีค่า Index = 0
            .Columns.Add("Printer Name", lvwData.Width \ 3 + 90)
            .Columns.Add("Printer Status", lvwData.Width \ 3 - 60)
            .Columns.Add("Default Printer", lvwData.Width \ 3 - 60)
      End With
    End Sub

    Private Sub btnListPrinter_Click(sender As System.Object, e As System.EventArgs) Handles btnListPrinter.Click
      Dim WmiQuery As String = "SELECT * FROM Win32_Printer"
      Dim WmiSearcher As New ManagementObjectSearcher(WmiQuery)
      lvwData.Items.Clear()
      WmiSearcher = New ManagementObjectSearcher(WmiQuery)
      '// Win32_Printer class
      '// https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/win32-printer (See ExtendedPrinterStatus)
      Dim PrinterStatuses As String() = {"Other", "Unknown", "Idle", "Printing", "WarmUp", "Stopped Printing", "Offline"}
      For Each Info As ManagementObject In WmiSearcher.Get()
            Try
                Dim LV As ListViewItem
                LV = lvwData.Items.Add(Info("Name"))'// สร้างโหนดหลัก คือ ชื่อเครื่องพิมพ์
                Dim status As UInt16 = CType(Info.Properties("PrinterStatus").Value - 1, UInt16)
                LV.SubItems.Add(PrinterStatuses(status))    '// Printer Status
                LV.SubItems.Add(Info("Default"))      '// Default Printer
            Catch ex As Exception
            End Try
      Next
    End Sub

    Private Sub frmListPrinter_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
      Me.Dispose()
      Application.Exit()
    End Sub

    Private Sub frmListPrinter_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Call InitListView()
    End Sub

    Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
      Me.Close()
    End Sub
End Class

มาดูโค้ดในส่วนของ VB6
' / --------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' / Purpose:List Printers with WMI.
' / Microsoft Visual Basic 6.0 (SP6)
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------------
Option Explicit

'/ Initial ListView
Sub SetupListView()
    With Me.lvwPrinter
      ' Coding with Run Time
      .View = lvwReport
      .Arrange = lvwNone
      .LabelEdit = lvwManual
      .BorderStyle = ccFixedSingle
      .Appearance = cc3D
      
      .HideColumnHeaders = False
      .HideSelection = False
      .LabelWrap = False
      .MultiSelect = False
      .Enabled = True
      .AllowColumnReorder = True
      .Checkboxes = False
      .FlatScrollBar = False
      .FullRowSelect = True
      .GridLines = True
      .HotTracking = False
      .HoverSelection = False
      
      .Sorted = False 'True
      .SortKey = 0
      .SortOrder = lvwAscending
      
      '/ Add header
      .ColumnHeaders.Add , , "Printer Name", .Width \ 3 + 1500
      .ColumnHeaders.Add , , "Printer Status", .Width \ 3 - 600
      .ColumnHeaders.Add , , "Default Printer", .Width \ 3 - 1000, lvwColumnLeft
    End With
   
End Sub

Private Sub cmdListPrinter_Click()
    Dim objItem As Object
    Dim colItems As Object
    Dim objWMIService As Object
    Dim strComputer As String
    strComputer = "."
    Dim LV As ListItem
    '// Clear Item ListView
    lvwPrinter.ListItems.Clear
    '// Win32_Printer class
    '// https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/win32-printer (See ExtendedPrinterStatus)
    Dim PrinterStatuses(7) As String
    PrinterStatuses(1) = "Other"
    PrinterStatuses(2) = "Unknown"
    PrinterStatuses(3) = "Idle"
    PrinterStatuses(4) = "Printing"
    PrinterStatuses(5) = "WarmUp"
    PrinterStatuses(6) = "Stopped Printing"
    PrinterStatuses(7) = "Offline"
    '//
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer", , 48)
    '//
    For Each objItem In colItems
      Set LV = lvwPrinter.ListItems.Add(, , Trim(objItem.Name))   '// Printer Name
      LV.SubItems(1) = PrinterStatuses(objItem.PrinterStatus) '// Printer Status
      LV.SubItems(2) = objItem.Default    '// Default Printer
    Next
End Sub

Private Sub Form_Load()
    '// Initial ListView Control
    Call SetupListView
End Sub

Private Sub Form_Resize()
    On Error Resume Next
    If Me.WindowState = vbMinimized Then Exit Sub
    ' Width
    If Me.Width <> 8625 Then Me.Width = 8625
    ' Height
    If Me.Height <> 6750 Then Me.Height = 6750
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set frmListPrinter = Nothing
    End
End Sub

Private Sub cmdExit_Click()
    Unload Me
End Sub


ดาวน์โหลดโค้ดต้นฉบับทั้ง VB6/VB.NET (2010) ได้ที่นี่




หน้า: [1]
ดูในรูปแบบกติ: [VB6/VB.NET] การแสดงรายชื่อเครื่องพิมพ์ และสถานะด้วยการใช้งาน WMI