WIA.DeviceManager.DeviceInfos.Count = 0.لماذا ؟
-
22-08-2019 - |
سؤال
أحاول التعرف على الماسحات الضوئية المرفقة إلى جهاز الكمبيوتر.أحد الحلول الممكنة هو استخدام ويا (ويندوز الحصول على صورة أتمتة المكتبة).
كانت تلك الإجراءات حتى الآن:
- تحميل wiaaut.dll
- نسخ إلى system32
- سجل مع "regsvr32 wiaaut.dll" (بنجاح)
- إضافة مرجع إلى المشروع في Visual Studio.NET
- تحقق من أن الحصول على صورة Windows (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);
}
}
}
}
ومع ذلك ، فإن مدير.DeviceInfos دائما فارغة.لدي 2 الماسحات الضوئية المرفقة ، واحد منهم يظهر في لوحة التحكم->الماسحات الضوئية والكاميرات, واحد لا كل من المعرض تحت عنوان "أجهزة التصوير" في "إدارة الأجهزة".
أي اقتراح لماذا لا تظهر في WIA.DeviceManager.DeviceInfos?
يعمل على Windows XP Service Pack 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 ترجمة.و سيتم تشغيل..
أنا أعمل مع هذا في جافا لذا ربما تلميح ليست صحيحة ، ولكن يمكنني استخدام الخاص بك المذكورة الطريقة فقط من أجل windows vista و في وقت لاحق...لذلك يبدو أنك تستخدم ويا 2.0 ولكن ويندوز ME و XP يجب عليك استخدام ويا 1.0
في MSDN هو وصفها..
ربما أنها سوف تساعد
حاول تغيير الخط :
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
واستبدال مع:
foreach (manager.DeviceInfo info in manager.DeviceInfos)
أرجو أن أكون ساعدت أنت.