Вопрос

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

Это были мои действия на данный момент:

  • Скачать 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

Это было полезно?

Решение

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

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
}

}

Другие советы

 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, она скомпилируется.и побежит..

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

В MSDN это описано..
возможно, это поможет

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

foreach (WIA.DeviceInfo info in manager.DeviceInfos)

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

foreach (manager.DeviceInfo info in manager.DeviceInfos)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top