Запретить пользователю печатать

Я создал приложение в .net для мониторинга заданий на принтере с помощью DLL в следующей ссылке:

http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET?fid=1556859&select=4799234

мой вопрос: как я могу задержать или запретить пользователю печатать после того, как он печатает, например, 5 раз в день?

Зная, что задания на печать будут сохранены в БД.

Я ценю любую помощь.


person MohammadSia    schedule 15.04.2014    source источник
comment
Можно ли просто купить что-то вроде PaperCut?   -  person Alan B    schedule 15.04.2014
comment
Я разрабатываю это для себя, и мне не нужны инструменты.   -  person MohammadSia    schedule 15.04.2014


Ответы (2)


Можно написать довольно простую программу, используя FindFirstPrinterChangeNotification, которая отслеживает все принтеры, доступные пользователю. Он должен следить за событием PRINTER_CHANGE_ADD_JOB, указывающим на то, что задание на печать было запущено. Как только пользователь превысит критерии, ваша программа удалит все новые задания на печать, запущенные пользователем. Я думаю, что было бы лучше уведомить пользователя, а не просто молча удалять его задания на печать.

Это не мешает пользователям пытаться печатать, но имеет тот же конечный результат. Бумага не будет производиться до тех пор, пока это не будет разрешено вашим приложением.

person Carey Gregory    schedule 18.04.2014
comment
большое спасибо за ваш ответ ... но я обнаружил, что класс ManagementObjectCollection содержит методы паузы и удаления, и я использую его для решения своей проблемы, и он отлично работает Теперь :) - person MohammadSia; 07.05.2014
comment
@MohammadSia Тогда вы должны написать ответ на свой вопрос и принять его, чтобы другие могли извлечь из этого пользу. - person Carey Gregory; 07.05.2014

Решено! Я использовал следующие методы для решения моей проблемы:

чтобы приостановить работу принтера, вызовите это :

 Public Shared Function PausePrintJob(printerName As String, printJobID As Integer) As Boolean 
        Dim isActionPerformed As Boolean = False
        Dim searchQuery As String = "SELECT * FROM Win32_PrintJob"
        Dim searchPrintJobs As New ManagementObjectSearcher(searchQuery)
        Dim prntJobCollection As ManagementObjectCollection = searchPrintJobs.[Get]()
        For Each prntJob As ManagementObject In prntJobCollection
            Dim jobName As System.String = prntJob.Properties("Name").Value.ToString()

            Dim splitArr As Char() = New Char(0) {}
            splitArr(0) = Convert.ToChar(",")
            Dim prnterName As String = jobName.Split(splitArr)(0)
            Dim prntJobID As Integer = Convert.ToInt32(jobName.Split(splitArr)(1))
            Dim documentName As String = prntJob.Properties("Document").Value.ToString()
            If [String].Compare(prnterName, printerName, True) = 0 Then
                If prntJobID = printJobID Then
                    prntJob.InvokeMethod("Pause", Nothing)
                    isActionPerformed = True
                    Exit For
                End If
            End If
        Next
        Return isActionPerformed
    End Function

А для отмены заданий принтера я использовал следующий метод:

    Public Shared Function CancelPrintJob(printerName As String, printJobID As Integer) As Boolean
        Dim isActionPerformed As Boolean = False
        Dim searchQuery As String = "SELECT * FROM Win32_PrintJob"
        Dim searchPrintJobs As New ManagementObjectSearcher(searchQuery)
        Dim prntJobCollection As ManagementObjectCollection = searchPrintJobs.[Get]()
        For Each prntJob As ManagementObject In prntJobCollection
            Dim jobName As System.String = prntJob.Properties("Name").Value.ToString()

            Dim splitArr As Char() = New Char(0) {}
            splitArr(0) = Convert.ToChar(",")
            Dim prnterName As String = jobName.Split(splitArr)(0)
            Dim prntJobID As Integer = Convert.ToInt32(jobName.Split(splitArr)(1))
            Dim documentName As String = prntJob.Properties("Document").Value.ToString()
            If [String].Compare(prnterName, printerName, True) = 0 Then
                If prntJobID = printJobID Then                 
                    prntJob.Delete()
                    isActionPerformed = True
                    Exit For
                End If
            End If
        Next
        Return isActionPerformed
    End Function 



И если вам нужно возобновить печать после паузы, вы должны использовать:

  Public Shared Function ResumePrintJob(printerName As String, printJobID As Integer) As Boolean
        Dim isActionPerformed As Boolean = False
        Dim searchQuery As String = "SELECT * FROM Win32_PrintJob"
        Dim searchPrintJobs As New ManagementObjectSearcher(searchQuery)
        Dim prntJobCollection As ManagementObjectCollection = searchPrintJobs.[Get]()
        For Each prntJob As ManagementObject In prntJobCollection
            Dim jobName As System.String = prntJob.Properties("Name").Value.ToString()
            Dim splitArr As Char() = New Char(0) {}
            splitArr(0) = Convert.ToChar(",")
            Dim prnterName As String = jobName.Split(splitArr)(0)
            Dim prntJobID As Integer = Convert.ToInt32(jobName.Split(splitArr)(1))
            Dim documentName As String = prntJob.Properties("Document").Value.ToString()
            If [String].Compare(prnterName, printerName, True) = 0 Then
                If prntJobID = printJobID Then
                    prntJob.InvokeMethod("Resume", Nothing)
                    isActionPerformed = True
                    Exit For
                End If
            End If
        Next
        Return isActionPerformed
    End Function
person MohammadSia    schedule 08.05.2014
comment
FindFirstPrinterChangeNotification работает асинхронно. Как вам удалось отменить задание на печать, как только поступило задание на печать? - person Jude Aloysius; 28.05.2018