VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 696|回复: 5

如何用vc检测打印机卡纸,缺纸,状态?

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-27 19:20:01 | 显示全部楼层 |阅读模式
如何用vc检测打印机卡纸,缺纸,状态?希望各位知道的师兄,师姐能够指点小弟一二。
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-3-3 19:00:02 | 显示全部楼层
        CDC dc;
if ( !dc.CreateDC(chDriverName,chPrintName,chPort,de))
                return 2002;
怎样通过dc来获取HANDLE hPrinter 打印机句柄
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-3-4 18:15:01 | 显示全部楼层
看看 view里面 几个打印相关事件传得几个参数,呵呵,懒得帮你找了
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-12 09:00:01 | 显示全部楼层
没听说过,估计是没有统一的标准的。打印机的driver当然可以做到。程序就不好说了。

但是为什么要这样的功能呢?程序只要知道打印机是否接收了数据就可以了。
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-3-12 21:15:01 | 显示全部楼层
        HANDLE hPrint =  dc.GetWindow();
        if (IsPrinterError(hPrint)) {
                return 3;
        }
BOOL IsPrinterError(HANDLE hPrinter)
{
       
        JOB_INFO_2  *pJobs;
        int         cJobs,
                i;
        DWORD       dwPrinterStatus;
       
        /*
        *  Get the state information for the Printer Queue and
        *  the jobs in the Printer Queue.
        */
        if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
                return FALSE;
       
                /*
        *  If the Printer reports an error, believe it.
        */
        if (dwPrinterStatus &
                (PRINTER_STATUS_ERROR |
                PRINTER_STATUS_PAPER_JAM |
                PRINTER_STATUS_PAPER_OUT |
                PRINTER_STATUS_PAPER_PROBLEM |
                PRINTER_STATUS_OUTPUT_BIN_FULL |
                PRINTER_STATUS_NOT_AVAILABLE |
                PRINTER_STATUS_NO_TONER |
                PRINTER_STATUS_OUT_OF_MEMORY |
                PRINTER_STATUS_OFFLINE |
                PRINTER_STATUS_DOOR_OPEN))
        {
                free( pJobs );
                return TRUE;
        }
       
        /*
        *  Find the Job in the Queue that is printing.
        */
        for (i=0; i < cJobs; i++)
        {
                if (pJobs[i].Status & JOB_STATUS_PRINTING)
                {
                /*
                *  If the job is in an error state,
                *  report an error for the printer.
                *  Code could be inserted here to
                *  attempt an interpretation of the
                *  pStatus member as well.
                        */
                        if (pJobs[i].Status &
                                (JOB_STATUS_ERROR |
                                JOB_STATUS_OFFLINE |
                                JOB_STATUS_PAPEROUT |
                                JOB_STATUS_BLOCKED_DEVQ))
                        {
                                free( pJobs );
                                return TRUE;
                        }
                }
        }
       
        /*
        *  No error condition.
        */
        free( pJobs );
        return FALSE;
       
}

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;
       
        /* Get the printer information. */
        if (!GetPrinter(hPrinter,
                2,
                (unsigned char *)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;
       
}
不知道这样对不对,希望各位知道的师哥师姐指点一二!!
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-5-12 19:00:01 | 显示全部楼层
太长了 下次我用到再来Copy~.~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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