При вызове find_package
имя пакета чувствительно к регистру . Правильное название пакета, соответствующего GTest, - «GTest».
Имя пакета с неправильным регистром может иногда работать (например, с нечувствительной к регистру файловой системой или если пакет описан файлом <lower-case-name>-config.cmake
). Но лучше не полагаться на такие функции и использовать имя пакета, которое указано в его документации.
Возможно, я отвечаю на вопрос слишком буквально, но использую API TWAIN, не возможно проверить, включено ли устройство т.е. подключено и включено. Стандарт TWAIN действительно определяет возможность с этой целью под названием CAP_DEVICEONLINE, но эта функция так плохо задумана, и так мало драйверов реализует его правильно, что это бесполезно на практике.
Самое близкое, которое можно получить, является этим: Откройте устройство (MSG_OPENDS): Почти все драйверы проверят на готовый к устройству, когда они будут открыты и отобразят ошибочное диалоговое окно пользователю. Нет никакого механизма TWAIN для подавления или обнаружения этого диалогового окна, которое Некоторые драйверы позволят пользователю исправлять проблему и продолжать, в этом случае Вы (Ваше приложение) никогда не будете знать, что была проблема. Некоторые драйверы позволят пользователю отменять, в этом случае операция MESSAGE_OPENDS перестанет работать, вероятно, возвращая TWRC_CANCEL, но возможно TWRC_FAILURE
Несколько драйверов TWAIN откроются без ошибки даже при том, что устройство в режиме офлайн. Такой драйвер может возвратить FALSE к запросу CAP_DEVICEONLINE. Такой драйвер, вероятно, сделает проверку онлайн устройством при включении устройства с MESSAGE_ENABLEDS, и затем если устройство не онлайн, Вы получаете ошибочное диалоговое окно пользователю, и так далее как выше.
В стороне и IMPO: WIA является 'более современным', но также и намного менее всесторонним для сканирования, чем TWAIN и по моему опыту неприменимым для многостраничного сканирования от фидера документа. Разработчики и специалисты по обслуживанию WIA, кажется, не понимают или заботятся о сканерах кроме низкопроизводительных потребительских планшетов. Это хорошо для камер.
Я запустил с того же исходного кода, который Вы загрузили с 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");
}
}
}
Я обычно инициирую событие сканирования на отдельном потоке для приложения для не замораживания, в то время как сканирование происходит.
просто добавьте этот код в свою команду TwainCommand (cmd)
case TwainCommand.Null:
{
EndingScan();
tw.CloseSrc();
Msgbox("There is no device or the scannning has been cancelled.");
break;
}
, он появится, если система не обнаружит устройства или сканирование было отменено.
Я пытаюсь сделать это, но не работает с TWAIN mybe попробуйте WIA
mybe попробуйте следующее:
на сканере запуска кнопки
timer1.Interval = 30000;
switch (cmd)
{
case TwainCommand.TransferReady:
{
..........
}
default:
{
timer1.Start();
break;
}
на отметке таймера события
{
EndingScan();
tw.CloseSrc();
}