如果把打印机设置为保存已打印完作业,比较简单,使用enumjobs即可,但是不能设置为保存模式,因此打印完的作业就从打印队列中清空,无法得到它的信息,如果可以在程序开始把打印机设置为保存打印完作业,程序结束再改回不保存状态也可以  ,但是我不知道怎么编程实现,请高人赐教!!!!  
 
   我有一种方法,是设置一个timer,隔断时间取一次打印队列的信息,然后比较两次采样的第一个作业,如果两个作业不同,表明之前采样时的作业已经完成,但是这种方法有缺陷,如果用户可以把打印机状态设置为暂停,再把第一个作业取消,我就无法判断它究竟是打印完了,还是被用户取消了.  

解决方案 »

  1.   

    你可以捕获打印机的状态改变做一些处理。使用API函数:
    HANDLE FindFirstPrinterChangeNotification(
      HANDLE hPrinter,  // handle to printer or print server to monitor 
                        // for changes
      DWORD fdwFlags,   // flags that specify the conditions to monitor
      DWORD fdwOptions, // reserved, must be zero
      LPVOID pPrinterNotifyOptions
                        // pointer to structure specifying printer 
                        // information to monitor
    );
    --创建一个打印机状态改变对象,并获得其句柄。
    使用PRINTER_CHANGE_JOB作为fdwFlags。
    然后使用API函数:
    BOOL FindNextPrinterChangeNotification(
      HANDLE hChange,              // handle to change notification 
                                   // object of interest
      PDWORD pdwChange,            // pointer to a value that indicates 
                                   // the condition that changed
      LPVOID pPrinterNotifyOptions,  // pointer to a structure that 
                                     // specifies a refresh flag
      LPVOID *ppPrinterNotifyInfo  // pointer to a pointer that receives 
                                   // printer information buffer
    );
    使用PRINTER_CHANGE_WRITE_JOB --Job data was written作为pdwChange。用于捕获Job被执行完毕。在这个过程中你可以使用WaitSingleObject捕获这些改变,做处理。具体的参考MSDN。记得在不需要这个打印机状态改变对象的时候使用API函数:
    BOOL FindClosePrinterChangeNotification(
      HANDLE hChange  // handle to change notification object to close
    );
    释放这个对象。 这几个API函数的作用就是:创建一个打印机状态改变通知对象,然后使用Wait系列函数在打印机状态发生改变的时候得到通知,就和线程等内核对象的同步操作是一样的,当得到这个通知以后使用第二个API获得具体的信息。
      

  2.   

    vcleaner  谢谢  你说的方法之前我也试过,   PRINTER_CHANGE_WRITE_JOB 好象并不是作业完成以后才会触发,我打印了一个文件做试验,发现整个过程都没有触发 PRINTER_CHANGE_WRITE_JOB ,不知是怎么回事,还有一个文件打印完后, PRINTER_CHANGE_SET_JOB会被触发.但是对于具体的设置怎么变的,我也不清楚,对于 PRINTER_NOTIFY_OPTIONS结构体怎么使用,你会吗???   
      如果你做过这方面的内容,可不可以留个qq号码   多谢!!!!
      

  3.   

    你可以在微软的网站上下载到例子:
    http://support.microsoft.com/kb/q196805/
    PrintMon.exe中示范了怎么使用那几个API。
      

  4.   

    呵呵  谢谢vcleaner大哥了  我是个新手  刚刚注册的 ^_^ 因为没人给我回复 加上这是工作任务比较着急 所以就用分数来吸引大家眼球了  真的谢谢你!!我先去看一下printMon的源程序 如有不懂 还要请教你啊 !!!!