WIA.DeviceManager.DeviceInfos.Count = 0. Почему? - PullRequest
2 голосов
/ 10 февраля 2009

Я пытаюсь определить сканеры, подключенные к компьютеру. Одним из возможных решений является использование WIA (Windows Auto Acquisition Automation Library).

Пока это были мои действия:

  • Скачать wiaaut.dll
  • Скопируйте его в system32
  • Зарегистрируйте его с помощью "regsvr32 wiaaut.dll" (успешно)
  • Добавить ссылку на мой проект в Visual Studio.NET
  • Убедитесь, что служба Windows Image Acquisition (WIA) работает

Затем я добавляю и отлаживаю следующий код:

WIA.DeviceManager manager = new WIA.DeviceManagerClass();
string deviceName = "";
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
{
    if (info.Type == WIA.WiaDeviceType.ScannerDeviceType)
    {
        foreach (WIA.Property p in info.Properties)
        {
            if (p.Name == "Name")
                {
                    deviceName = ((WIA.IProperty)p).get_Value().ToString();
                    Console.WriteLine(deviceName);
                }
        }
    }
}

Тем не менее, manager.DeviceInfos всегда пуст. У меня есть 2 подключенных сканера, один из которых отображается на панели управления-> Сканеры и камеры, другой нет, и оба отображаются в разделе «Устройства обработки изображений» в Диспетчере устройств.

Любое предложение о том, почему ничего не появляется в WIA.DeviceManager.DeviceInfos?

Работает в Windows XP с пакетом обновления 2

Ответы [ 4 ]

1 голос
/ 16 мая 2012
 foreach (WIA.Property p in info.Properties)
     {
         if (p.Name == "Name") <-- p is a property why cast like you doing above.
         {
             deviceName = ((WIA.IProperty)p).get_Value().ToString();
             Console.WriteLine(deviceName);
         }
     }

попробуйте это:

deviceName = p.get_Value();

это будет выглядеть как ошибка на visual studio, но когда вы нажмете клавишу f5, вы скомпилируете. и побежит ..

0 голосов
/ 18 сентября 2009

попробуйте с этим классом:

using System;
using System.Collections.Generic;
using System.Text;
using WIA;
using WIAVIDEOLib;
namespace Scanner
{
public class ImageAcquisition
{

    private WIALib.WiaClass WiaClass;
    private WIALib.ItemClass ItemClass;
    private WIALib.CollectionClass CollectionClassDevices;
    private WIALib.CollectionClass CollectionClassPics;


    #region SelectDevice
    public bool SelectDevice()
    {
        try
        {
            object selectUsingUI;

            WiaClass = new WIALib.WiaClass();
            CollectionClassDevices = (WIALib.CollectionClass)WiaClass.Devices;

            if (WiaClass.Devices.Count == 0)
                return false;

            selectUsingUI = System.Reflection.Missing.Value;

            ItemClass = (WIALib.ItemClass)WiaClass.Create(ref selectUsingUI);

            if (ItemClass == null)
                return false;

            return true;
        }
        catch (System.Exception exp)
        {
            return false;
        }
    }
    #endregion

    #region Capture
    public System.Drawing.Image Capture()
    {
        try
        {
            CollectionClassPics = ItemClass.GetItemsFromUI(WIALib.WiaFlag.SingleImage, WIALib.WiaIntent.ImageTypeColor) as WIALib.CollectionClass;
            if (CollectionClassPics == null)
                return null;

            ItemClass = (WIALib.ItemClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(CollectionClassPics[0], typeof(WIALib.ItemClass));
            string imageFileName = System.IO.Path.GetTempFileName();
            ItemClass.Transfer(imageFileName, false);
            System.Drawing.Image Image = System.Drawing.Image.FromFile(imageFileName);

            System.Runtime.InteropServices.Marshal.ReleaseComObject(CollectionClassPics[0]);
            return Image;
        }
        catch (System.Exception exp)
        {
            return null;
        }
    }
    #endregion
}

}

0 голосов
/ 23 ноября 2010

Я работаю с этим в Java, поэтому, возможно, моя подсказка не верна, но я использую ваш упомянутый способ только для Windows Vista и позже ... похоже, вы используете wia 2.0, но для Windows ME и XP вы должны использовать wia 1.0

На MSDN описано ..
может быть, это поможет

0 голосов
/ 30 августа 2009

Попробуйте изменить строку:

foreach (WIA.DeviceInfo info in manager.DeviceInfos)

и заменить на:

foreach (manager.DeviceInfo info in manager.DeviceInfos)

Надеюсь, я тебе помог.

...