程序因套打连续表格需要而用PRINTER生成许多条打印任务。想在打印每条记录时伴有打印提示消息如:正在打印第N条记录。现在ENDDOC后加了MSGBOX,可是由于打印机处理比VB程序慢的多,所以第一条还没打印完,提示消息却从头到未都提了一遍了。如何解决呢?

解决方案 »

  1.   

    这个没什么好办法,打印任务由操作系统后台统一调度,查查打印方面的API,看有没有监视打印任务完成的API。
    ...
    开始打印
    ....
    if 打印完成 then
       打印下一条
    else
       等待
    end if 
    ....
      

  2.   

    这样做就不是Windows下的打印机理了,DOS是这样的。
      

  3.   

    程序因套打连续表格需要而用PRINTER生成许多条打印任务。想在打印每条记录时伴有打印提示消息如:正在打印第N条记录。现在ENDDOC后加了MSGBOX,可是由于打印机处理比VB程序慢的多,所以第一条还没打印完,提示消息却从头到未都提了一遍了。如何解决呢?没办法
      

  4.   

    这是一个能获得打印机消息的可编成DLL的VC++6源码,在假定打印任务是排第一的前提下,如何解决所提的问题?
    (我看不清在VB如何提供该函数的参数,帮忙看一下。)#include <windows.h>extern "C" BOOL _declspec(dllexport)  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,(unsigned char*)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)) 
         { 
         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)) 
         { 
         return TRUE; 
         } 
         } 
         } 
         
         /* 
         * No error condition. 
         */ 
         return FALSE; 
         
         }