#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. Это больше похоже на догадку, чем на ответ. И это неверное предположение.