简体   繁体   English

禁止用户打印

[英]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 : 我已经在.net中创建了一个应用程序,以使用以下参考资料中的DLL来监视打印机中的作业:

http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET?fid=1556859&select=4799234 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 ? 我的问题是:在每天打印5次之后,如何延迟或阻止用户打印?

Knowing that The print jobs will saved in the DB. 知道打印作业将保存在数据库中。

I appreciate any help. 感谢您的帮助。

A fairly simply program could be written using the FindFirstPrinterChangeNotification function that monitors all printers available to the user. 可以使用FindFirstPrinterChangeNotification函数编写一个相当简单的程序,该函数监视用户可用的所有打印机。 It should watch for the PRINTER_CHANGE_ADD_JOB event, which indicates a print job has been started. 它应注意PRINTER_CHANGE_ADD_JOB事件,该事件指示已开始打印作业。 Once the user has exceeded the criteria, your program would then delete any new print jobs the user started. 一旦用户超出标准,您的程序便会删除该用户启动的所有新打印作业。 I think it would be best to notify the user rather than just deleting their print jobs silently. 我认为最好通知用户,而不是仅静默删除其打印作业。

This doesn't prevent users from trying to print, but it does have the same end result. 这不会阻止用户尝试打印,但是最终结果相同。 No paper will be produced until your application allows it. 在您的应用程序允许之前,不会产生纸张。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM