如何在c#.net中获取HP Scanner 5590平板的状态?

时间:2012-06-16 07:08:12

标签: c# .net vb.net device status

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

开/关, 闲, 扫描, 等。

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

请帮助。

3 个答案:

答案 0 :(得分:4)

你可以使用WMI来获取这样的信息。请参阅此帖子How to get Printer Info in .NET?作为参考。

<强>更新 尝试搜索PnP实体:

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

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

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

答案 1 :(得分: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”的引用。

enter image description here

添加参考后,您可以枚举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-bed数组,而不是基于0的数组!如果您不这样做,您将获得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 Image Acquisition (WIA)

使用WIA API,您至少可以检测扫描仪是否已连接到系统并已打开电源。这涉及开/关问题。

您还可以使用WIA查询设备属性。

Scanner Device Property Constants

您可能会对以下设备属性感兴趣:

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

答案 2 :(得分: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));     
    } 
}