判断USB打印机离线状态

项目需要判断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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值