找回密码
 加入
搜索
查看: 2644|回复: 4

[系统综合] 求助:怎样判断打印已经完成。

[复制链接]
发表于 2012-9-12 21:18:06 | 显示全部楼层 |阅读模式
求高手赐教,判断系统打印任务已经完成,本来我是搜索系统C:\WINDOWS\system32\spool\PRINTERS 文件夹中是否存在.spl临时文件来判断的,但经常出现,打印已经完成,而.spl临时文件还存在很长时间才被删除,导致不能及时处理,求高手给个更合理的方法代码。谢谢!
发表于 2012-9-12 21:24:11 | 显示全部楼层
打印时,托盘图标状态不同吧, 用这个来判断及时一点.
胡想的, 现在没条件测试...
 楼主| 发表于 2012-9-12 21:31:20 | 显示全部楼层
谢谢楼上帮忙想办法,但我有使用虚拟打印机,没有系统托盘图标的。
发表于 2012-9-12 21:59:04 | 显示全部楼层
有個位置啦 但是老實說我不知道怎麼弄....位置就是 當你有打印的時候 你點兩下打印機 會出現 有文件正在打印.....打印完成 那個文件訊息一定會消失
....怎麼判斷我就不懂啦....可能要抓取系統還有幾個文件佇列了
发表于 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[200];                           //消息
        DWORD   iPrinted;                           //已打印的页数
        AnsiString   asDocName;               //正在打印的文档名
        String   NodeName;       //节名称字符串
        String   KeyName;//键名称字符串
        char   DefaultString[256];//在键名没有找到时默认返回的字符串
        char   ReturnedString[256];//在键名找到时返回的字符串

        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);
        }
}
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-20 09:24 , Processed in 0.079202 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表