我的系统上连接了 HP 扫描仪 Scanjet 5590。我想通过 c#.net 了解扫描仪的状态。怎么做?状态是:
开/关、空闲、扫描等。
更新:我也尝试过使用 WMI,但它没有检测到它。在 Win-7 的控制面板中,扫描仪显示在头部 DEVICES 下方,而不是头部 PRINTERS 下方。
请帮忙。
你可以使用 WMI 来获取这样的信息。请参阅这篇文章如何在 .NET 中获取打印机信息?作为参考。
更新: 尝试搜索 PnP 实体:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_PnPEntity");
ManagementObjectCollection coll = searcher.Get();
foreach (ManagementObject any in coll)
{
// Check for device name
}
这应该为您提供所有设备的列表。
您可以尝试使用 Windows Image Acquisition (WIA) API。WIA 2.0 随 Windows Vista 一起发布,主要针对扫描仪。Windows 7 仍然支持它。不久前,我使用 HP Scanjet 4670 扫描仪对其进行了测试。您的扫描仪应该与 WIA API 兼容。
要访问 WIA 2.0,您需要添加对 COM 库“Microsoft Windows Image Acquisition Library v2.0”的引用。
添加参考后,您可以枚举 WIA 兼容设备。
var deviceManager = new DeviceManager();
for (int i = 1; i <= deviceManager.DeviceInfos.Count; i++)
{
var deviceName =
deviceManager.DeviceInfos[i].Properties["Name"].get_Value().ToString();
// Is the device a scanner?
if (deviceManager.DeviceInfos[i].Type == WiaDeviceType.ScannerDeviceType)
{
//...etc.
}
}
备注:请务必将 DeviceInfos 数组视为 1 基数组,而不是从零开始的数组!如果你不这样做,你会得到 COM 异常。
当您在 DeviceInfos[...] 数组中找到您的扫描仪时,您可以连接到它。
DeviceInfo deviceInfo = deviceManager.DeviceInfos[1];
deviceInfo.Connect();
连接好后就可以操作了。让我们扫描图像。
// Start the scan
var item = deviceInfo.Items[1];
var imageFile = (ImageFile) item.Transfer(FormatID.wiaFormatJPEG);
您可以在此处找到有关上述内容的更多信息:
使用 WIA API,您至少能够检测扫描仪是否已连接到您的系统并已打开电源。这涉及开/关问题。
您还可以使用 WIA 查询设备属性。
您可能会对以下设备属性感兴趣:
WIA_DPS_DOCUMENT_HANDLING_STATUS:包含扫描仪安装的平板、文档进纸器或双面打印器的当前状态(就绪、卡纸、灯错误...等)。
查询 WIA_DPS_DOCUMENT_HANDLING_STATUS 以检查扫描仪的当前状态。
例如:
class WIA_PROPERTIES
{
public const uint WIA_RESERVED_FOR_NEW_PROPS = 1024;
public const uint WIA_DIP_FIRST = 2;
public const uint WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
// Scanner only device properties
public const uint WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13;
}
Property documentHandlingStatus = null;
foreach (Property property in device.Properties)
{
string propertyName = property.Name;
string propertyValue = property.get_Value().ToString();
if (property.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS)
{
// ...
}
}
查看 Microsoft 的 WiaDef.h 头文件以获取这些设备属性常量的值。
string printerName = "HP Scanner Scanjet 5590";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection coll = searcher.Get();
foreach (ManagementObject printer in coll)
{
foreach (PropertyData property in printer.Properties)
{
Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
}
}