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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top