WIA.DeviceManager.DeviceInfos.Count = 0.Почему?
-
22-08-2019 - |
Вопрос
Я пытаюсь идентифицировать сканеры, подключенные к компьютеру.Одним из возможных решений является использование WIA (библиотека автоматизации сбора изображений Windows).
Это были мои действия на данный момент:
- Скачать 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
Решение
попробуйте это с этим классом:
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
}
}
Другие советы
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();
это будет отображаться как ошибка в Visual Studio, но когда вы нажмете f5, она скомпилируется.и побежит..
Я работаю с этим в Java, поэтому, возможно, мой намек неверен, но я использую упомянутый вами способ только для Windows Vista и более поздних версий...Похоже, вы используете Wia 2.0, но для Windows ME и XP вам следует использовать Wia 1.0.
В MSDN это описано..
возможно, это поможет
Попробуйте изменить строку:
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
и замените на:
foreach (manager.DeviceInfo info in manager.DeviceInfos)
Надеюсь, я помог тебе.