2

コンピュータに接続されているスキャナを特定しようとしています。考えられる解決策の 1 つは、WIA (Windows Image Acquisition Automation Library) を使用することです。

これまでの私の行動は次のとおりです。

  • 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 つのスキャナーが接続されています。そのうちの 1 つは [コントロール パネル] -> [スキャナーとカメラ] に表示され、もう 1 つは表示されず、両方ともデバイス マネージャーの [イメージング デバイス] に表示されます。

WIA.DeviceManager.DeviceInfos に何も表示されない理由について何か提案はありますか?

Windows XP Service Pack 2 での実行

4

4 に答える 4

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

これは Visual Studio ではエラーのように表示されますが、f5 を押すとコンパイルされます。そして走ります..

于 2012-05-16T04:19:27.080 に答える
0

私はJavaでこれを扱っているので、ヒントが正しくないかもしれませんが、あなたの言及した方法をWindows Vista以降でのみ使用しています...したがって、wia 2.0を使用しているように見えますが、Windows MEおよびXPではwia 1.0を使用する必要があります

MSDNで説明されています..
多分それは助けになるでしょう

于 2010-11-23T14:42:29.327 に答える
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
}

}

于 2009-09-18T09:47:17.923 に答える
-2

行を変更してみてください:

foreach (WIA.DeviceInfo info in manager.DeviceInfos)

次のように置き換えます。

foreach (manager.DeviceInfo info in manager.DeviceInfos)

お役に立てば幸いです。

于 2009-08-30T03:59:56.170 に答える