Pergunta

Eu estou tentando identificar os scanners ligados ao computador. Uma das possíveis soluções é usar WIA (Windows Image Acquisition Biblioteca Automation).

Estas foram minhas ações até agora:

  • Baixar wiaaut.dll
  • Copiar para system32
  • Registre-lo com "regsvr32 wiaaut.dll" (com sucesso)
  • Adicionar referência ao meu projeto no Visual Studio.NET
  • Verifique se o serviço Windows Image Acquisition (WIA) está em execução

Em seguida, eu adicionar e depurar o código a seguir:

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);
                }
        }
    }
}

No entanto, os manager.DeviceInfos está sempre vazia. Tenho 2 scanners em anexo, um deles shows em Painel de controle-> Scanners e câmeras, um não, e ambos mostram em "Dispositivos de imagens" no Gerenciador de dispositivos.

Qualquer sugestão sobre por que nenhum estão aparecendo em WIA.DeviceManager.DeviceInfos?

Em execução no Windows XP Service Pack 2

Foi útil?

Solução

experimentá-lo com esta classe:

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
}

}

Outras dicas

 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);
         }
     }

tente o seguinte:

deviceName = p.get_Value();

isso vai mostrar como um erro no visual studio, mas quando você pressionar F5 irá compilar. e será executado ..

Eu trabalho com isso em java então talvez minha dica is not correto, mas eu uso o seu caminho mencionado apenas para Windows Vista e mais tarde ... então parece que você está usando WIA 2.0, mas para Windows ME e XP você deve usar WIA 1.0

Na MSDN é descrito. .
talvez ele vai ajudar

Tente alterar a linha:

foreach (WIA.DeviceInfo info in manager.DeviceInfos)

e substituir por:

foreach (manager.DeviceInfo info in manager.DeviceInfos)

Espero ter ajudado você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top