我正在尝试捕获打印机作业详细信息,并且我的程序运行正常,但在一台计算机上除外。 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;
}
}
答案 0 :(得分:2)
作业状态值的documentation表示:
此成员可以是以下一个或多个值。
这是Microsoft代码,用于引入通过使用按位OR组合位标志而生成的值。
您的值为0x2010,这是Winspool.h中定义的以下值组合:
JOB_STATUS_RETAINED
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