Как проверить, подключен ли сканер (C#, .NET TWAIN)

Я использую код .NET TWAIN с сайта http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx в моем приложении. Когда я пытаюсь отсканировать изображение, когда сканер не подключен, приложение зависает.

Как я могу проверить, подключено ли устройство с помощью драйвера TWAIN?


person SelvirK    schedule 19.09.2008    source источник


Ответы (5)


Возможно, я воспринимаю вопрос слишком буквально, но с помощью TWAIN API невозможно проверить, подключено ли устройство, т.е. подключено и включено ли оно. Стандарт TWAIN определяет для этой цели возможность, называемую CAP_DEVICEONLINE, но эта функция настолько плохо продумана и так мало драйверов реализует ее правильно, что на практике она бесполезна.

Самое близкое, что вы можете получить, это: Откройте устройство (MSG_OPENDS): почти все драйверы проверяют готовность к устройству при открытии и отображают диалоговое окно с ошибкой для пользователя. Не существует механизма TWAIN для подавления или обнаружения этого диалогового окна Некоторые драйверы позволяют пользователю исправить проблему и продолжить работу, и в этом случае вы (ваше приложение) никогда не узнаете, что возникла проблема. Некоторые драйверы позволяют пользователю отменить операцию, и в этом случае операция MSG_OPENDS завершится ошибкой, вероятно, возвратив TWRC_CANCEL, но, возможно, TWRC_FAILURE.

Некоторые драйверы TWAIN открываются без ошибок, даже если устройство находится в автономном режиме. Такой драйвер может вернуть FALSE на запрос CAP_DEVICEONLINE. Такой драйвер, вероятно, выполнит проверку устройства в сети, когда вы включите устройство с помощью MSG_ENABLEDS, а затем, если устройство не в сети, вы получите диалоговое окно с ошибкой для пользователя и т. д., как указано выше.

В сторону и IMPO: WIA «более современен», но также гораздо менее универсален для сканирования, чем TWAIN, и, по моему опыту, непригоден для многостраничного сканирования из устройства подачи документов. Разработчики и специалисты по обслуживанию WIA, похоже, не понимают и не заботятся о сканерах, кроме недорогих потребительских планшетов. Это хорошо для камер.

person Spike0xff    schedule 10.10.2008

Я начал с того же исходного кода, который вы загрузили из CodeProject, но перенес большую часть кода из MainFrame.cs, который инициирует сканирование, в класс Scanner. Для проверки ошибок сканирования я вызываю следующий метод вместо прямого вызова Twain.Acquire:

enum AcquireResult
{
    OK = 0,
    InitFailed = 1,
    DeviceIDFailed = 2,
    CapabilityFailed = 3,
    UserInterfaceError = 4
}
private void StartScan()
{
    if (!_msgFilter)
    {
        _parent.Enabled = false;
        _msgFilter = true;
        Application.AddMessageFilter(this);
    }
    AcquireResult ar = _twain.Acquire();
    if (ar != AcquireResult.OK)
    {
        EndingScan();
        switch (ar)
        {
            case AcquireResult.CapabilityFailed:
                throw new Exception("Scanner capability setup failed");
            case AcquireResult.DeviceIDFailed:
                throw new Exception("Unable to determine device identity");
            case AcquireResult.InitFailed:
                throw new Exception("Scanner initialisation failed");
            case AcquireResult.UserInterfaceError:
                throw new Exception("Error with the Twain user interface");
            default:
                throw new Exception("Document scanning failed");
        }
    }
}

Обычно я инициирую событие сканирования в отдельном потоке, чтобы приложение не зависало во время сканирования.

person Veldmuis    schedule 01.10.2008

просто добавьте этот код в свой TwainCommand (cmd)

case TwainCommand.Null:
    {
     EndingScan();
     tw.CloseSrc();
             Msgbox("There is no device or the scannning has been cancelled.");
     break;
    }

это появится, если системы не обнаружат ни одного устройства или сканирование было отменено.

person Community    schedule 24.06.2009

Вы можете проверить в реестре. В:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} каждый сканер, который когда-либо был обнаружен, перечисляется там в подразделах.

Начиная с 0000, пройдите и проверьте, является ли значение CreateFileName пустым или содержит данные.

Если в нем есть данные, это подключенный сканер, если он пустой, он не подключен.

person Dan Elm    schedule 18.12.2014
comment
К сожалению, некоторые сканеры сообщают об одном имени в TWAIN, но отображаются под другим именем в реестре. Хотя этот трюк иногда срабатывает. - person piedar; 07.12.2016

я пытаюсь сделать это, но не работает с TWAIN, может попробовать WIA

может попробовать это:

по кнопке запустить сканер

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

{
..........
}

default:

{
timer1.Start();
break;
}

по таймеру события

{
EndingScan();
tw.CloseSrc();
}
person Mariusz Szefera    schedule 24.04.2010
comment
Это больше похоже на предположение, чем на ответ. И неверная догадка. - person Bob Kaufman; 24.05.2012