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

#c# #twain

Вопрос:

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

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

Ответ №1:

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

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

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

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

Ответ №2:

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

 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");
        }
    }
}
 

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

Ответ №3:

просто добавьте этот код в свою команду Twain (cmd)

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

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

Ответ №4:

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

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

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

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

Комментарии:

1. К сожалению, некоторые сканеры сообщают ТВЕНУ об одном имени, но в реестре оно отображается под другим именем. Хотя этот трюк иногда срабатывает.

Ответ №5:

я пытаюсь сделать это, но не очень хорошо работаю с TWAIN mybe, попробуйте.

моя, попробуй это:

на сканере buton run

 timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}
 

на отметке таймера события

 {
EndingScan();
tw.CloseSrc();
}
 

Комментарии:

1. Это больше похоже на догадку, чем на ответ. И это неверное предположение.