网络(LAN)设置中连接的打印机很少,没有域控制器。为打印机指定了特定的IP地址。我希望将所有打印机活动记录到数据库(或文件系统)中。我还想控制打印机,例如,如果任何用户(通过IP地址)希望以横向打印,但我的一台打印机配置为仅纵向打印,则打印机应拒绝打印。另一个示例是,如果用户超出了打印限制(页数),则打印机不应打印下一页。

我不知道要实现这一目标。请给您宝贵的建议。代码段,想法是最受欢迎的。

最佳答案

请在MSDN上查看Print Spooler API函数:http://msdn.microsoft.com/en-us/library/dd162861(v=VS.85).aspx

如何正确调用Win32后台处理程序枚举API:http://support.microsoft.com/kb/158828

如何获取打印机和打印作业的状态:http://support.microsoft.com/kb/160129

样例代码:

 BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */

                    JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */
                    int *pcJobs,            /* Count of jobs filled.  */
                    DWORD *pStatus)         /* Print Queue status.    */

       {

       DWORD               cByteNeeded,
                            nReturned,
                            cByteUsed;
        JOB_INFO_2          *pJobStorage = NULL;
        PRINTER_INFO_2       *pPrinterInfo = NULL;

       /* Get the buffer size needed. */
           if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
           {
               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                   return FALSE;
           }

           pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
           if (!(pPrinterInfo))
               /* Failure to allocate memory. */
               return FALSE;

           /* Get the printer information. */
           if (!GetPrinter(hPrinter,
                   2,
                   (LPSTR)pPrinterInfo,
                   cByteNeeded,
                   &cByteUsed))
           {
               /* Failure to access the printer. */
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }

           /* Get job storage space. */
           if (!EnumJobs(hPrinter,
                   0,
                   pPrinterInfo->cJobs,
                   2,
                   NULL,
                   0,
                   (LPDWORD)&cByteNeeded,
                   (LPDWORD)&nReturned))
           {
               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               {
                   free(pPrinterInfo);
                   pPrinterInfo = NULL;
                   return FALSE;
               }
           }

           pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
           if (!pJobStorage)
           {
               /* Failure to allocate Job storage space. */
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }

           ZeroMemory(pJobStorage, cByteNeeded);

           /* Get the list of jobs. */
           if (!EnumJobs(hPrinter,
                   0,
                   pPrinterInfo->cJobs,
                   2,
                   (LPBYTE)pJobStorage,
                   cByteNeeded,
                   (LPDWORD)&cByteUsed,
                   (LPDWORD)&nReturned))
           {
               free(pPrinterInfo);
               free(pJobStorage);
               pJobStorage = NULL;
               pPrinterInfo = NULL;
               return FALSE;
           }

           /*
            *  Return the information.
            */
           *pcJobs = nReturned;
           *pStatus = pPrinterInfo->Status;
           *ppJobInfo = pJobStorage;
           free(pPrinterInfo);

           return TRUE;

       }

       BOOL IsPrinterError(HANDLE hPrinter)
       {

           JOB_INFO_2  *pJobs;
           int         cJobs,
                       i;
           DWORD       dwPrinterStatus;

           /*
            *  Get the state information for the Printer Queue and
            *  the jobs in the Printer Queue.
            */
           if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
                return FALSE;

           /*
            *  If the Printer reports an error, believe it.
            */
           if (dwPrinterStatus &
               (PRINTER_STATUS_ERROR |
               PRINTER_STATUS_PAPER_JAM |
               PRINTER_STATUS_PAPER_OUT |
               PRINTER_STATUS_PAPER_PROBLEM |
               PRINTER_STATUS_OUTPUT_BIN_FULL |
               PRINTER_STATUS_NOT_AVAILABLE |
               PRINTER_STATUS_NO_TONER |
               PRINTER_STATUS_OUT_OF_MEMORY |
               PRINTER_STATUS_OFFLINE |
               PRINTER_STATUS_DOOR_OPEN))
           {
               free( pJobs );
               return TRUE;
           }

           /*
            *  Find the Job in the Queue that is printing.
            */
           for (i=0; i < cJobs; i++)
           {
               if (pJobs[i].Status & JOB_STATUS_PRINTING)
               {
                   /*
                    *  If the job is in an error state,
                    *  report an error for the printer.
                    *  Code could be inserted here to
                    *  attempt an interpretation of the
                    *  pStatus member as well.
                    */
                   if (pJobs[i].Status &
                       (JOB_STATUS_ERROR |
                       JOB_STATUS_OFFLINE |
                       JOB_STATUS_PAPEROUT |
                       JOB_STATUS_BLOCKED_DEVQ))
                   {
                       free( pJobs );
                       return TRUE;
                   }
               }
           }

           /*
            *  No error condition.
            */
           free( pJobs );
           return FALSE;

       }

关于c++ - 在Windows操作系统中控制和记录打印机事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8505727/

10-11 22:48
查看更多