如果把打印机设置为保存已打印完作业,比较简单,使用enumjobs即可,但是不能设置为保存模式,因此打印完的作业就从打印队列中清空,无法得到它的信息,如果可以在程序开始把打印机设置为保存打印完作业,程序结束再改回不保存状态也可以 ,但是我不知道怎么编程实现,请高人赐教!!!!
我有一种方法,是设置一个timer,隔断时间取一次打印队列的信息,然后比较两次采样的第一个作业,如果两个作业不同,表明之前采样时的作业已经完成,但是这种方法有缺陷,如果用户可以把打印机状态设置为暂停,再把第一个作业取消,我就无法判断它究竟是打印完了,还是被用户取消了.
我有一种方法,是设置一个timer,隔断时间取一次打印队列的信息,然后比较两次采样的第一个作业,如果两个作业不同,表明之前采样时的作业已经完成,但是这种方法有缺陷,如果用户可以把打印机状态设置为暂停,再把第一个作业取消,我就无法判断它究竟是打印完了,还是被用户取消了.
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获得具体的信息。
如果你做过这方面的内容,可不可以留个qq号码 多谢!!!!
http://support.microsoft.com/kb/q196805/
PrintMon.exe中示范了怎么使用那几个API。