2009-02-10 19 views
2

J'essaie d'identifier les scanners connectés à l'ordinateur. L'une des solutions possibles consiste à utiliser WIA (Windows Image Acquisition Automation Library).WIA.DeviceManager.DeviceInfos.Count = 0. Pourquoi?

Ce sont mes actions à ce jour:

  • Télécharger wiaaut.dll
  • Copiez à SYSTEM32
  • enregistrer avec "regsvr32 wiaaut.dll" (avec succès)
  • Ajouter une référence à mon projet dans Visual Studio.NET
  • Vérifiez que le service WIA (Windows Image Acquisition) est en cours d'exécution

Ensuite, j'ajouter et déboguer le code suivant:

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

Cependant, les manager.DeviceInfos est toujours vide. J'ai 2 scanners attachés, l'un d'entre eux montre dans le Panneau de configuration-> Scanners et appareils photo, un ne le fait pas, et les deux montrent sous "Imaging Devices" dans le Gestionnaire de périphériques.

Aucune suggestion sur les raisons pour lesquelles aucune n'apparaît dans WIA.DeviceManager.DeviceInfos?

Fonctionnant sur Windows XP Service Pack 2

+0

J'ai le même problème - avez-vous trouvé une solution pour cela? –

Répondre

0

essayer avec cette 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 
} 

}

+0

Pouvez-vous poster des liens pertinents? D'où obtenons-nous ce WIALib? et WIAVIDEOLib? –

+0

@AkashKava: vérifiez ceci [link] (http://stackoverflow.com/questions/39276) –

-2

Essayez de changer la ligne:

foreach (WIA.DeviceInfo info in manager.DeviceInfos) 

et le remplacer par:

foreach (manager.DeviceInfo info in manager.DeviceInfos) 

J'espère que je vous ai aidé.

+0

Malheureusement, de cette façon, il ne serait même pas compiler ... – Evgeny

0

Je travaille avec cela en java alors peut-être mon indice isnt correct, mais j'utiliser votre façon mentionné uniquement pour Windows Vista et plus tard ... donc il semble que vous utilisez WIA 2.0 mais pour windows ME et XP, vous devez utiliser WIA 1.0

a MSDN il est décrit ..
peut-être cela aidera

+0

wow je n'ai pas réalisé qu'il est question d'un an: D – Zavael

+1

Vous n'avez pas à utiliser wia 1.0 pour xp. Vérifiez http://msdn.microsoft.com/en-us/library/ms630827(v=vs.85).Il est dit: Les applications qui utilisent l'API de couche d'automatisation WIA requièrent Windows XP Service Pack 1 (SP1) ou version ultérieure. Les versions antérieures de Windows ne sont pas prises en charge. – elif

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

essayez ceci:

deviceName = p.get_Value(); 

cela montrera comme une erreur sur Visual Studio, mais lorsque vous appuyez sur f5 compilera. et fonctionnera ..