求助:怎样判断打印已经完成。
求高手赐教,判断系统打印任务已经完成,本来我是搜索系统C:\WINDOWS\system32\spool\PRINTERS 文件夹中是否存在.spl临时文件来判断的,但经常出现,打印已经完成,而.spl临时文件还存在很长时间才被删除,导致不能及时处理,求高手给个更合理的方法代码。谢谢! 打印时,托盘图标状态不同吧, 用这个来判断及时一点.胡想的, 现在没条件测试... 谢谢楼上帮忙想办法,但我有使用虚拟打印机,没有系统托盘图标的。 有個位置啦 但是老實說我不知道怎麼弄....位置就是 當你有打印的時候 你點兩下打印機 會出現 有文件正在打印.....打印完成 那個文件訊息一定會消失
....怎麼判斷我就不懂啦....可能要抓取系統還有幾個文件佇列了 找到個資料 但是 需要高手幫你轉嚕
/***************************************************************************/
/////////////////////////////////////////////////////////////////////////////
//函数名: Execute()
//功能说明:线程的执行函数,获得打印机的当前打印作业名及正在打印的页码.
// 并通知管理系统.
//参数:
//返回值:
/////////////////////////////////////////////////////////////////////////////
void __fastcall TthrdPrint::Execute()
{
//---- Place thread code here ----
BOOL bRval = 0;
HANDLE pHandle = NULL; //打印机句柄
JOB_INFO_2 *pJob = NULL; //打印机任务信息
DWORD dwNeeded, dwReturned;
AnsiString asMsg, asRptName, asTemp;
char cMsg; //消息
DWORD iPrinted; //已打印的页数
AnsiString asDocName; //正在打印的文档名
String NodeName; //节名称字符串
String KeyName;//键名称字符串
char DefaultString;//在键名没有找到时默认返回的字符串
char ReturnedString;//在键名找到时返回的字符串
try
{
//取得默认的打印机名
NodeName = "windows "; // 节名称
KeyName = "device "; // 键名称
strcpy(DefaultString, "Unknown ");
GetProfileString(
NodeName.c_str(),
KeyName.c_str(),
DefaultString,
ReturnedString,
sizeof(ReturnedString));
asTemp = AnsiString(ReturnedString);
asTemp =asTemp.SubString(1, asTemp.Pos( ", ") - 1);
if(asTemp == " ")
{
memset(cMsg, 0x00, 200);
strcpy(cMsg, "报表服务机上没有默认打印机! ");
frmReportMain-> Udp-> SendBuffer(cMsg, 200, strlen(cMsg));
bRval = ClosePrinter(pHandle);
return;
}
//打开打印机
bRval = OpenPrinter(asTemp.c_str(), &pHandle, NULL);
if(!pHandle) return;
//while(!this-> Terminated)
{
//枚举该打印机中的作业队列
bRval = EnumJobs(pHandle,// handle to printer object
0,// location of first job in print queue to enumerate
1,// number of jobs to enumerate
2,// structure level
NULL,// pointer to structure array
0,// size of array, in bytes
&dwNeeded,// addr. of variable with no. of bytes copied (or required)
&dwReturned // addr. of variable with no. of job info. structures copied
);
if(!dwNeeded) //没有作业
{
memset(cMsg, 0x00, 200);
asDocName = asDocName + ":打印完毕! ";
strcpy(cMsg, asDocName.c_str());
frmReportMain-> Udp-> SendBuffer(cMsg, 200, strlen(cMsg));
bRval = ClosePrinter(pHandle);
return;
}
pJob = (JOB_INFO_2 *)malloc(dwNeeded);
bRval = EnumJobs(pHandle,// handle to printer object
0,// location of first job in print queue to enumerate
1,// number of jobs to enumerate
2,// structure level
(LPBYTE)pJob,// pointer to structure array
dwNeeded,// size of array, in bytes
&dwNeeded,// addr. of variable with no. of bytes copied (or required)
&dwReturned // addr. of variable with no. of job info. structures copied
);
if(asDocName != AnsiString(pJob-> pDocument) || iPrinted != pJob-> PagesPrinted)
{
iPrinted = pJob-> PagesPrinted;
asDocName = AnsiString(pJob-> pDocument);
asMsg = asDocName + ":现在正在打印第 " + IntToStr(iPrinted + 1) +
"页,总共 " + IntToStr(pJob-> TotalPages) + "页 " ;
frmReportMain-> Memo1-> Lines-> Add(asMsg);
memset(cMsg, 0x00, 200);
strcpy(cMsg, asMsg.c_str());
//把当前打印信息报告ECP
frmReportMain-> Udp-> SendBuffer(cMsg, 200, strlen(cMsg));
}
free(pJob);
pJob = NULL;
Application-> ProcessMessages();
Sleep(2000); //间隔2秒检查一次
}
frmReportMain-> threadOverFlag = 1;
}
catch(Exception &e)
{
if(pHandle) ClosePrinter(pHandle);
if(pJob) free(pJob);
pJob = NULL;
frmReportMain-> WirteLog(e.Message);
}
}
页:
[1]