سؤال

أحاول التعرف على الماسحات الضوئية المرفقة إلى جهاز الكمبيوتر.أحد الحلول الممكنة هو استخدام ويا (ويندوز الحصول على صورة أتمتة المكتبة).

كانت تلك الإجراءات حتى الآن:

  • تحميل 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)

أرجو أن أكون ساعدت أنت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top