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

При вызове find_package имя пакета чувствительно к регистру . Правильное название пакета, соответствующего GTest, - «GTest».


Имя пакета с неправильным регистром может иногда работать (например, с нечувствительной к регистру файловой системой или если пакет описан файлом <lower-case-name>-config.cmake). Но лучше не полагаться на такие функции и использовать имя пакета, которое указано в его документации.

8
задан rjzii 2 May 2014 в 15:07
поделиться

4 ответа

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

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

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

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

12
ответ дан 5 December 2019 в 12:15
поделиться

Я запустил с того же исходного кода, который Вы загрузили с 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");
        }
    }
}

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

2
ответ дан 5 December 2019 в 12:15
поделиться

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

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

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

1
ответ дан 5 December 2019 в 12:15
поделиться

Я пытаюсь сделать это, но не работает с TWAIN mybe попробуйте WIA

mybe попробуйте следующее:

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

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}

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

{
EndingScan();
tw.CloseSrc();
}
-2
ответ дан 5 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: