项目需要判断USB打印机状态,使用GetPrinter得到的打印机状态一直为0。观察操作系统打印机显示,点打印机属性后发现,离线状态的USB打印机硬件tab是空的,也就是说没有检查到打印机硬件信息。因此试想能不能通过硬件信息判断打印机离线状态。查找打印机在注册表中对应的信息,发现SYSTEM\CurrentControlSet\Control\Print\Printers下能看到USB打印机对应的设备InstanceID。于是考虑通过判断注册表对应打印机设备ID是否存在来判断USB打印机的离线状态,最终通过如下方式实现:
```boolean IsPrinterEnable (char * PrinterName)
{
unsigned i;
CONFIGRET status;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
char szDeviceInstanceID [MAX_DEVICE_ID_LEN];
boolean rs=false;
hDevInfo = SetupDiGetClassDevs (NULL, "USBPRINT", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
return true;
for (i = 0; ; i++) {
DeviceInfoData.cbSize = sizeof (DeviceInfoData);
if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
break;
status = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID , MAX_PATH, 0);
if (status != CR_SUCCESS)
continue;
printf ("InstanceID: \"%s\"\n", szDeviceInstanceID);
//HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\HP LaserJet 1020\PnPData
HKEY hKey;
DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
DWORD dwType=REG_SZ;
char regpath[1024]={0};
char printerInstanceID[1024]={0};
sprintf_s(regpath,"SYSTEM\\CurrentControlSet\\Control\\Print\\Printers\\%s\\PnPData",PrinterName);
LONG lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, regpath, NULL, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
if ( ERROR_SUCCESS != lRet) continue;
DWORD nsize=1024;
lRet=RegQueryValueEx(hKey, "DeviceInstanceId", NULL, &dwType, (LPBYTE)printerInstanceID, &nsize);
RegCloseKey(hKey);
if ( ERROR_SUCCESS != lRet)
{
printf ("read reg fail\n");
continue;
}
if(_strcmpi(printerInstanceID,szDeviceInstanceID)==0) //usb printer存在
{
rs=true;
break;
}
else
continue;
}
return rs;
}