1

我的系统上连接了 HP 扫描仪 Scanjet 5590。我想通过 c#.net 了解扫描仪的状态。怎么做?状态是:

开/关、空闲、扫描等。

更新:我也尝试过使用 WMI,但它没有检测到它。在 Win-7 的控制面板中,扫描仪显示在头部 DEVICES 下方,而不是头部 PRINTERS 下方。

请帮忙。

4

3 回答 3

4

你可以使用 WMI 来获取这样的信息。请参阅这篇文章如何在 .NET 中获取打印机信息?作为参考。

更新: 尝试搜索 PnP 实体:

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_PnPEntity");
            ManagementObjectCollection coll = searcher.Get();

            foreach (ManagementObject any in coll)
            {
                   // Check for device name
            }

这应该为您提供所有设备的列表。

于 2012-06-16T07:35:34.390 回答
2

您可以尝试使用 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);

您可以在此处找到有关上述内容的更多信息:

Windows 图像采集 (WIA)

使用 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 头文件以获取这些设备属性常量的值。

WiaDef.h

于 2012-06-19T07:06:44.577 回答
0
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));     
    } 
}
于 2012-06-20T11:42:15.093 回答