WIA.DeviceManager.DeviceInfos.Count = 0. Por quê?
-
22-08-2019 - |
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
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ê.