WIA.DeviceManager.DeviceInfos.Count = 0. Warum?
-
22-08-2019 - |
Frage
Ich versuche, die Scanner an den Computer angeschlossen zu identifizieren. Eine der möglichen Lösungen ist WIA (Windows Image Acquisition Automation Library) zu verwenden.
Das waren meine Handlungen so weit:
- Download wiaaut.dll
- Kopieren Sie es in system32
- Registrieren Sie mit "regsvr32 wiaaut.dll" (erfolgreich)
- In Bezug auf mein Projekt in Visual Studio.NET Überprüfen
- , dass die Windows Image Acquisition (WIA) läuft
Als nächstes füge ich hinzu und debuggen den folgenden Code:
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);
}
}
}
}
Allerdings ist die manager.DeviceInfos immer leer. Ich habe 2 Scanner angebracht ist, einer von ihnen zeigt in Systemsteuerung-> Scanner und Kameras, man tut es nicht, und beide zeigen unter „Imaging Devices“ im Geräte-Manager.
Jeder Vorschlag auf, warum keiner in WIA.DeviceManager.DeviceInfos erscheinen?
Beim Laufen auf Windows XP Service Pack 2
Lösung
versuchen Sie es mit dieser Klasse:
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
}
}
Andere Tipps
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);
}
}
versuchen Sie dies:
deviceName = p.get_Value();
Dies wird wie ein Fehler auf Visual Studio zeigen, aber wenn man f5 kompilieren drücken. und läuft ..
ich mit dieser Arbeit so vielleicht in Java mein Tipp ist nicht richtig, aber ich Sich für Windows Vista und später Weise nur erwähnt ... so sieht es aus wie Sie verwenden wia 2.0 aber für Windows ME und XP sollten Sie wia 1.0
MSDN es beschrieben wird. .
vielleicht wird es helfen,
Versuchen Sie die Zeile:
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
und ersetzen mit:
foreach (manager.DeviceInfo info in manager.DeviceInfos)
Ich hoffe, dass ich Ihnen geholfen.