Список установленных принтеров

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Список установленных принтеров

Сообщение oskolok_vatbI » 09.07.2008 (Ср) 16:39

Подскажите пожалуйста, как можно получить список установленных в системе принтеров и количество заданий на каждом. Сам не знаю, а поиск выдает примеры только для VB 6. Спасибо.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 09.07.2008 (Ср) 16:59

Что-то мне подсказывает, что нужно копать в сторону WMI.

Начать следует с пространства имен Management. Особое внимание уделить ManagementObject и ManagementObjectSearcher. Синтаксис базируется на SQL.



Строка для поиска:

Код: Выделить всё
SELECT * FROM Win32_Printer

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 11.07.2008 (Пт) 8:51

Глядеть для начала на это свойство: PrinterSettings.InstalledPrinters
Весь мир матрица, а мы в нем потоки байтов!

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Сообщение oskolok_vatbI » 11.07.2008 (Пт) 15:54

А можно ли через свойства получить состояние принтера, т.е. узнать есть на нем задания или нет ? Как это сделать используя WMI я разобрался, но во время выполнения запроса вся форма, на некоторое время, заметно подвисает.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 11.07.2008 (Пт) 15:56

oskolok_vatbI

А что мешает выполнить WMI-запросы в отдельном потоке? Например через BackgroundWorker.

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Сообщение oskolok_vatbI » 12.07.2008 (Сб) 13:33

Сделал так:
Код: Выделить всё
    Dim prStatus As Integer

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
                ByVal e As System.ComponentModel.DoWorkEventArgs) _
                Handles BackgroundWorker1.DoWork
        Try
            Dim Searcher As New ManagementObjectSearcher
            Searcher.Query = New SelectQuery _
            ("SELECT * FROM Win32_Printer Where Name=""FILE""")
            Dim obj As ManagementObject
            For Each obj In Searcher.Get
                prStatus = obj.GetPropertyValue("PrinterStatus")
            Next
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
                ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
                Handles BackgroundWorker1.RunWorkerCompleted
        prStat()
    End Sub

    Private Sub prStat()
        Select Case prStatus
            Case 3
                Label1.Text = "Free"
            Case Else
               Label1.Text = "Busy"
        End Select
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
                Handles Me.Load
        BackgroundWorker1.RunWorkerAsync()
    End Sub


Работает, но все равно, на смену состояния принтера реагирует дольше чем хотелось бы. Посоветуйте что-нибудь и, если кому не трудно, скажите какие ошибки допущены мной в этом кусочке кода. Спасибо.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.07.2008 (Пн) 16:21

- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 16.07.2008 (Ср) 19:30

oskolok_vatbI

Sebas прав. Для мониторинга это вполне подходит.



Добавляешь библиотечку, затем примерно так:



For Each myPrinter As String In Printing.PrinterSettings.InstalledPrinters



PrinterMonitorComponent1.AddPrinter(myPrinter)



Next



И не забудь зарегистрировать обработчики событий.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList