Search code examples
c#vb.netspoolerprint-spooler-api

Prevent User from Printing


I've created an application in .net to monitor jobs in the printer by using the DLL in the following reference :

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

my question is : how can i delay or prevent user from printing after he print for example 5 times a day ?

Knowing that The print jobs will saved in the DB.

I appreciate any help.


Solution

  • Solved ! I've used the following methods to solve my problem :

    to pause printer Job call this :

     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
    

    And to cancel printer jobs i've used the following method :

        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 
    



    And if need to resume the printing after pause then you should use :

      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