Вопрос по c#, twain – Как проверить, подключен ли сканер (C #, .NET TWAIN)
Я использую код .NET TWAIN изhttp://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx в моем приложении. Когда я пытаюсь отсканировать изображение, когда сканер не подключен, приложение зависает.
Как я могу проверить, подключено ли устройство, используя драйвер TWAIN?
я пытаюсь сделать это, но не работает хорошо с TWAIN mybe попробовать WIA
попробуй это:
на бутон запустить сканер
timer1.Interval = 30000;
switch (cmd)
{
case TwainCommand.TransferReady:
{
..........
}
default:
{
timer1.Start();
break;
}
по таймеру события
{
EndingScan();
tw.CloseSrc();
}
Я начал с того же исходного кода, который вы загрузили из 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");
}
}
}
Я обычно инициирую событие сканирования в отдельном потоке, чтобы приложение не зависало во время сканирования.
Вы можете проверить в реестре. В:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f}
каждый сканер, который когда-либо был обнаружен, перечисляется там в подразделах.
Начиная с0000
, пройти и проверить, еслиCreateFileName
значение пустое или содержит данные.
Если он имеет данные, он подключен к сканеру, если он пустой, он не подключен.
Возможно, я принимаю вопрос слишком буквально, но, используя TWAIN API, невозможно проверить, подключено ли устройство, то есть подключено и включено ли оно. Стандарт TWAIN действительно определяет для этой цели возможность, называемую CAP_DEVICEONLINE, но эта функция настолько плохо продумана, и лишь немногие драйверы реализуют ее правильно, что на практике она бесполезна.
Самое близкое, что вы можете получить, это: Открыть устройство (MSG_OPENDS): Почти все драйверы будут проверять готовность устройства, когда они открыты, и отображать диалоговое окно с ошибкой для пользователя.There is no TWAIN mechanism for suppressing or detecting this dialog Некоторые драйверы позволят пользователю исправить проблему и продолжить, и в этом случае вы (ваше приложение) никогда не узнаете, что возникла проблема. Некоторые драйверы позволяют пользователю отменять, и в этом случае операция MSG_OPENDS завершится неудачно, возможно, вернув TWRC_CANCEL, но, возможно, TWRC_FAILURE
Несколько драйверов TWAIN откроются без ошибок, даже если устройство находится в автономном режиме. Такой водительmay вернуть FALSE на запрос CAP_DEVICEONLINE. Такой драйвер, вероятно, выполнит проверку устройства в режиме онлайн, когда вы включите устройство с помощью MSG_ENABLEDS, а затем, если устройство не подключено к сети, вы получите диалоговое окно с сообщением об ошибке, и так далее, как описано выше.
Не говоря уже о IMPO: WIA является «более современной». но также гораздо менее всеобъемлющий для сканирования, чем TWAIN, и по моему опыту непригодный для многостраничного сканирования из устройства подачи документов. Дизайнеры и сопровождающие WIA, похоже, не понимают и не заботятся о сканерах, кроме планшетных компьютеров низкого уровня. Это хорошо для камер.