2009-02-10 4 views
2

Я пытаюсь определить сканеры, прикрепленные к компьютеру. Одним из возможных решений является использование WIA (Библиотека автоматизации сбора изображений Windows).WIA.DeviceManager.DeviceInfos.Count = 0. Почему?

Это были мои действия до сих пор:

  • Скачать wiaaut.dll
  • Скопируйте его в system32
  • Зарегистрируйте с "regsvr32 wiaaut.dll" (успешно)
  • Добавить ссылку на мой проект в Visual Studio.NET
  • Убедитесь, что служба Windows Image Acquisition (WIA) запущена

Далее я добавляю и отлаживать следующий код:

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

Однако manager.DeviceInfos всегда пусто. У меня есть 2 сканера, один из них отображается в Панели управления -> Сканеры и камеры, а другой нет, и оба отображаются в разделе «Устройства отображения» в диспетчере устройств.

Любое предложение о том, почему в WIA.DeviceManager.DeviceInfos отсутствуют какие-либо предложения?

Запуск на Windows XP с пакетом обновления 2

+0

У меня такая же проблема - вы нашли решение для этого? –

ответ

0

попробовать с этим классом:

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

Можете ли вы разместить соответствующие ссылки? Откуда мы получаем этот WIALIB? и WIAVIDEOLib? –

+0

@AkashKava: проверьте это [ссылка] (http://stackoverflow.com/questions/39276) –

-2

Попробуйте изменить строку:

foreach (WIA.DeviceInfo info in manager.DeviceInfos) 

и заменить:

foreach (manager.DeviceInfo info in manager.DeviceInfos) 

Я надеюсь, что я помог тебе.

+0

К сожалению, этот способ даже не компилируется ... – Evgeny

0

Я работаю с этим в Java, так, может быть, мой намек разве правильно, но я использовать свой упомянутый способ только для Windows Vista, а затем ... так это выглядит, как вы используете WIA 2.0, но для окон ME и XP вы должны использовать WIA 1,0

в MSDN описано ..
может быть, это поможет

+0

wow я не понял, что это вопрос один год: D – Zavael

+1

Вам не нужно использовать wia 1.0 для xp. Проверьте http://msdn.microsoft.com/en-us/library/ms630827(v=vs.85).aspx Он говорит: Приложения, использующие API WA Automation Layer, требуют Windows XP с пакетом обновления 1 (SP1) или более поздней версии. Более ранние версии Windows не поддерживаются. – 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); 
     } 
    } 

попробовать это:

deviceName = p.get_Value(); 

это покажет, как ошибки в визуальной студии, но при нажатии f5 будет компилировать. и будет работать.