获取打印机连接状态及打印任务是否错误

HANDLE   PrnHandle;   
    if   (OpenPrinter("EPSON Stylus Photo R270 Series",&PrnHandle,NULL))   
    {   
        unsigned    char   buf[8192];   
        DWORD   dwSize;   
        if   (GetPrinter(PrnHandle,2,buf,sizeof(buf),   
            &dwSize))   {   
            PRINTER_INFO_2*   pInfo;   
            pInfo   =   (PRINTER_INFO_2*)buf;   
            //pInfo->Status   就是打印机的状态,详细的代码可以   
            //参见winspool.h中以PRINTER_STATUS开头的宏定义   
            if(pInfo->Status==PRINTER_STATUS_PAUSED)   
                AfxMessageBox("a");   
            else   if(pInfo->Status==PRINTER_STATUS_PENDING_DELETION)   
                AfxMessageBox("b");   
            ///以上pInfo->Status代码试验不成功,哪位知道原因请告知,谢谢
            if (pInfo->Attributes&PRINTER_ATTRIBUTE_WORK_OFFLINE)//测试成功
            {
                AfxMessageBox("offline");
            }
            else
            {
                AfxMessageBox("online");
            }
        }   
        ClosePrinter(PrnHandle);
    }

上面是判断打印机是否连机的。
下面是判断打印任务是否正常完成的:
    SetTimer(1,500,NULL);//用定时器来完成

响应函数:
switch(nIDEvent)
    {
    case 1:
        {
            JOB_INFO_2  *pJobs;
       int         cJobs,
                   i;
       DWORD       dwPrinterStatus;
       if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
            return ;

       for (i=0; i < cJobs; i++)
       {
           if (pJobs[i].Status &
                   (JOB_STATUS_ERROR |
                   JOB_STATUS_OFFLINE |
                   JOB_STATUS_PAPEROUT |
                   JOB_STATUS_BLOCKED_DEVQ))
               {                   
                   KillTimer(1);
                   AfxMessageBox(pJobs[i].pDocument);
                   free( pJobs );
                   return ;
               }
       }
       free( pJobs );
        }
        break;
    default:
        break;
    }

用到的方法:
BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */ 
                JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */ 
                int *pcJobs,            /* Count of jobs filled.  */ 
                DWORD *pStatus)         /* Print Queue status.    */ 
   {

   DWORD               cByteNeeded,
                        nReturned,
                        cByteUsed;
    JOB_INFO_2          *pJobStorage = NULL;
    PRINTER_INFO_2       *pPrinterInfo = NULL;

   /* Get the buffer size needed. */ 
       if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               return FALSE;
       }

       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
       if (!(pPrinterInfo))
           /* Failure to allocate memory. */ 
           return FALSE;

       LPCSTR str="sssssssssss";
       /* Get the printer information. */ 
       if (!GetPrinter(hPrinter,2,(unsigned char *)(LPSTR)pPrinterInfo,cByteNeeded,&cByteUsed))
       {
           /* Failure to access the printer. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       /* Get job storage space. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               NULL,
               0,
               (LPDWORD)&cByteNeeded,
               (LPDWORD)&nReturned))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
           {
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }
       }

       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
       if (!pJobStorage)
       {
           /* Failure to allocate Job storage space. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       ZeroMemory(pJobStorage, cByteNeeded);

       /* Get the list of jobs. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               (LPBYTE)pJobStorage,
               cByteNeeded,
               (LPDWORD)&cByteUsed,
               (LPDWORD)&nReturned))
       {
           free(pPrinterInfo);
           free(pJobStorage);
           pJobStorage = NULL;
           pPrinterInfo = NULL;
           return FALSE;
       }

       /*
        *  Return the information.
        */ 
       *pcJobs = nReturned;
       *pStatus = pPrinterInfo->Status;
       *ppJobInfo = pJobStorage;
       free(pPrinterInfo);

       return TRUE;

   }


需要插入头文件#include <winspool.h>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Win1操作系统中连接打印机的代码如下: 1. 首先,我们需要引入相关的打印机API,可以使用Windows提供的打印机相关接口。 2. 然后,我们使用相应的代码与打印机建立连接。可以通过以下步骤实现: a. 获取系统中可用的打印机列表,可以使用`EnumPrinters`函数。 b. 遍历打印机列表,选择目标打印机。 c. 打开选定的打印机,这可以使用`OpenPrinter`函数。 3. 一旦与打印机建立连接,我们就可以使用相应的打印命令发送打印任务打印机了。例如,可以使用`StartDocPrinter`函数开始打印任务,然后使用`WritePrinter`函数向打印机发送打印数据,最后使用`EndDocPrinter`函数结束打印任务。 修复打印机连接的工具通常会根据具体问题而不同。以下是一些常见的修复打印机连接问题的工具和方法: 1. 检查打印机驱动程序是否已安装并正确配置。可以通过打开设备管理器来查看打印机驱动程序的状态,并尝试更新或重新安装需要的驱动程序。 2. 检查打印机和电脑之间的连接是否正常。确保打印机与电脑通过正确的接口(如USB、网络等)连接并且连接线无故障。 3. 检查打印机是否处于正常工作状态。可以尝试打印机的自检功能,或通过打印测试页来验证打印机是否能正常工作。 4. 清除打印队列。有时打印队列中的堵塞或错误打印任务可能导致连接问题。可以尝试清空打印队列并重新启动打印服务来解决该问题。 5. 运行Windows的打印问题解决工具。Windows操作系统提供了一些内置的打印问题解决工具,如“打印故障排除”工具,可以尝试使用这些工具来诊断和修复打印机连接问题。 6. 如果以上方法都无法解决问题,可以尝试从打印机制造商的官方网站下载和安装最新的驱动程序,并按照其提供的连接指南进行操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值