yyczzz 发表于 2012-9-12 21:18:06

求助:怎样判断打印已经完成。

求高手赐教,判断系统打印任务已经完成,本来我是搜索系统C:\WINDOWS\system32\spool\PRINTERS 文件夹中是否存在.spl临时文件来判断的,但经常出现,打印已经完成,而.spl临时文件还存在很长时间才被删除,导致不能及时处理,求高手给个更合理的方法代码。谢谢!

user3000 发表于 2012-9-12 21:24:11

打印时,托盘图标状态不同吧, 用这个来判断及时一点.
胡想的, 现在没条件测试...

yyczzz 发表于 2012-9-12 21:31:20

谢谢楼上帮忙想办法,但我有使用虚拟打印机,没有系统托盘图标的。

kk_lee69 发表于 2012-9-12 21:59:04

有個位置啦 但是老實說我不知道怎麼弄....位置就是 當你有打印的時候 你點兩下打印機 會出現 有文件正在打印.....打印完成 那個文件訊息一定會消失
....怎麼判斷我就不懂啦....可能要抓取系統還有幾個文件佇列了

kk_lee69 发表于 2012-9-12 22:07:57

找到個資料 但是 需要高手幫你轉嚕

/***************************************************************************/
/////////////////////////////////////////////////////////////////////////////
//函数名:   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]
查看完整版本: 求助:怎样判断打印已经完成。