2011-12-14 25 views
0

ドメインコントローラを使用しないネットワーク(LAN)設定で接続されているプリンタはほとんどありません。プリンタには特定のIPアドレスが与えられます。私はすべてのプリンタ活動をデータベース(またはファイルシステム)に記録したいと思います。また、私はプリンタを制御したいと思っています。たとえば、IPアドレスのユーザーが横向きで印刷したいのですが、プリンタがポートレートで印刷するように設定されている場合、プリンタは印刷を拒否しなければなりません。もう1つの例は、ユーザーが印刷制限(ページ数)を超えた場合、プリンターは次のページを印刷しないことです。Windowsオペレーティングシステムでのプリンタアクティビティの制御とログ

私はこれを達成することは考えていません。親切に貴重な提案をしてください。コードスニペット、アイデアは大歓迎です。

答えて

1

MSDNで印刷スプーラ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; 

     } 
+0

こんにちは@Michaelのおかげで、この情報のためにたくさん。私はすべてのプリンタアクティビティをログに記録し、プリンタジョブを制御したいと考えています。これを達成するために私を助けてください。 – Nagesh

関連する問題