次のリファレンスの DLL を使用して、プリンターのジョブを監視するアプリケーションを .net で作成しました。
私の質問は、たとえば 1 日に 5 回印刷した後、ユーザーの印刷を遅らせたり、防止したりするにはどうすればよいですか?
印刷ジョブがDBに保存されることを知っています。
助けていただければ幸いです。
次のリファレンスの DLL を使用して、プリンターのジョブを監視するアプリケーションを .net で作成しました。
私の質問は、たとえば 1 日に 5 回印刷した後、ユーザーの印刷を遅らせたり、防止したりするにはどうすればよいですか?
印刷ジョブがDBに保存されることを知っています。
助けていただければ幸いです。
ユーザーが使用できるすべてのプリンタを監視するFindFirstPrinterChangeNotification関数を使用して、かなり単純なプログラムを作成できます。PRINTER_CHANGE_ADD_JOB
印刷ジョブが開始されたことを示すイベントを監視する必要があります。ユーザーが基準を超えると、プログラムはユーザーが開始した新しい印刷ジョブを削除します。黙って印刷ジョブを削除するのではなく、ユーザーに通知するのが最善だと思います。
これは、ユーザーが印刷を試みるのを妨げるものではありませんが、最終的には同じ結果になります。アプリケーションが許可するまで、用紙は作成されません。
解決しました!問題を解決するために次の方法を使用しました。
プリンタ ジョブを一時停止するには、次のように呼び出します。
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