从结构PRINTER_NOTIFY_INFO_DATA

时间:2016-11-24 05:48:51

标签: windows winapi visual-c++

我正在尝试捕获打印机作业详细信息,并且我的程序运行正常,但在一台计算机上除外。 Data.NotifyData.adwData [0]返回的值是8208(以十进制表示)并且它与任何预定义值都不匹配,我搜索了这个并且找不到任何信息,并且GetLastError返回0。

 PRINTER_NOTIFY_INFO_DATA &Data = pNotification->aData[x];
    if( Data.Type == JOB_NOTIFY_TYPE )
        {
            switch( Data.Field )
            {
                case JOB_NOTIFY_FIELD_STATUS:

                    printf("Case:JOB_NOTIFY_FIELD_STATUS,adwData[0]:%x\n",Data.NotifyData.adwData[0]);
                    if(Data.NotifyData.adwData[0] == JOB_STATUS_SPOOLING) 
                    {
                        //SetEvent
                    }
                    if(Data.NotifyData.adwData[0] == JOB_STATUS_PRINTING) 
                    {
                        //SetEvent
                    }

                break;
            }
        }

1 个答案:

答案 0 :(得分:2)

作业状态值的documentation表示:

  

此成员可以是以下一个或多个值。

这是Microsoft代码,用于引入通过使用按位OR组合位标志而生成的值。

您的值为0x2010,这是Winspool.h中定义的以下值组合:

  • 0x2000,JOB_STATUS_RETAINED
  • 0x0010,JOB_STATUS_PRINTING

所以你的价值是JOB_STATUS_RETAINED | JOB_STATUS_PRINTING

在任何情况下,您都不应直接测试整个值。你需要按位测试:

DWORD status = Data.NotifyData.adwData[0];
if (status & JOB_STATUS_PAUSED) 
    // ... 
if (status & JOB_STATUS_ERROR) 
    // ... 
if (status & JOB_STATUS_DELETING) 
    // ... 
if (status & JOB_STATUS_SPOOLING) 
    // ... 
if (status & JOB_STATUS_PRINTING) 
    // ... 
// and so on for each status bit that is of interest