Использование сканера без диалогов в С#

Я создаю приложение .Net 4.0 для удаленного управления сканирующим устройством. Я пробовал библиотеки TWAIN и WIA, но у меня такая же проблема. Сканирование изображений без диалогов настроек сканирования и сканирования.

Я нашел полезную статью о сценариях WIA в .Net и изменил ее на это:

private Image Scan(string deviceName)
{
    WiaClass wiaManager = null;       // WIA manager COM object
    CollectionClass wiaDevs = null;   // WIA devices collection COM object
    ItemClass wiaRoot = null;         // WIA root device COM object
    CollectionClass wiaPics = null;   // WIA collection COM object
    ItemClass wiaItem = null;         // WIA image COM object

    try
    {
        // create COM instance of WIA manager
        wiaManager = new WiaClass();

        // call Wia.Devices to get all devices
        wiaDevs = wiaManager.Devices as CollectionClass;
        if ((wiaDevs == null) || (wiaDevs.Count == 0))
        {
            throw new Exception("No WIA devices found!");
        }

        object device = null;
        foreach (IWiaDeviceInfo currentDevice in wiaManager.Devices)
        {
            if (currentDevice.Name == deviceName)
            {
                device = currentDevice;
                break;
            }
        }

        if (device == null)
        {
            throw new Exception
            (
                "Device with name \"" + 
                deviceName + 
                "\" could not be found."
            );
        }

        // select device
        wiaRoot = (ItemClass)wiaManager.Create(ref device); 

        // something went wrong
        if (wiaRoot == null)
        {
            throw new Exception
            (
                "Could not initialize device \"" + 
                deviceName + "\"."
            );
        }

        wiaPics = wiaRoot.GetItemsFromUI
        (
            WiaFlag.SingleImage,
            WiaIntent.ImageTypeColor
        ) as CollectionClass;

        if (wiaPics == null || wiaPics.Count == 0)
        {
            throw new Exception("Could not scan image.");
        }

        Image image = null;

        // enumerate all the pictures the user selected
        foreach (object wiaObj in wiaPics)
        {
            if (image == null)
            {
                wiaItem = (ItemClass)Marshal.CreateWrapperOfType
                (
                    wiaObj, typeof(ItemClass)
                );

                // create temporary file for image
                string tempFile = Path.GetTempFileName();

                // transfer picture to our temporary file
                wiaItem.Transfer(tempFile, false);

                // create Image instance from file
                image = Image.FromFile(tempFile);
            }

            // release enumerated COM object
            Marshal.ReleaseComObject(wiaObj);
        }

        if (image == null)
        {
            throw new Exception("Error reading scanned image.");
        }

        return image;
    }
    finally
    {
        // release WIA image COM object
        if (wiaItem != null)
            Marshal.ReleaseComObject(wiaItem);

        // release WIA collection COM object
        if (wiaPics != null)
            Marshal.ReleaseComObject(wiaPics);

        // release WIA root device COM object
        if (wiaRoot != null)
            Marshal.ReleaseComObject(wiaRoot);

        // release WIA devices collection COM object
        if (wiaDevs != null)
            Marshal.ReleaseComObject(wiaDevs);

        // release WIA manager COM object
        if (wiaManager != null)
            Marshal.ReleaseComObject(wiaManager);
    }
}

При этом мне удалось выбрать устройство из конфигурации (входной параметр метода Scan) и получить полученное изображение после сканирования.

Но проблема в диалоге параметров сканирования (Сканирование с использованием DEVICENAME). Поскольку это приложение удаленного управления, диалог не будет отображаться для пользователя, поэтому мне нужно либо пропустить его, используя настройки по умолчанию, либо использовать настройки из конфигурации, если это необходимо.

Диалог настроек сканирования: scanning options dialog

Ответ 1

В конце концов я не использовал код, написанный в вопросе для сканирования диалогов. Я нашел полезный пример Сканирование с помощью Windows Image Acquisition 2.0 и изменил его в соответствии с моими потребностями. Сканирование без каких-либо диалогов.

Я написал статью о Использование сканера без диалогов в .Net с примером приложения, написанного на С#.

Ответ 2

Прежде всего, большое спасибо Мильенко Барбиру за его решение выше, он отлично работает.

Я хотел бы добавить, что если вы хотите нулевые диалоги, вы можете использовать (из демо-кода Милиенко)

WIA.ImageFile image = item.Transfer(wiaFormatBMP);

вместо

WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);

Это также удаляет индикатор выполнения, поэтому вы можете выполнять сканирование без каких-либо диалогов.

Ответ 3

// show scanner view 
guif.ShowUI = 0;
guif.ModalUI = 0;

Вы можете увидеть в этом коде, который я реализовал.