我在我的应用程序中使用http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx中的.NET TWAIN代码。 当我没有插入扫描仪时尝试扫描图像时,应用程序会冻结。
如何使用TWAIN驱动程序检查设备是否已插入?
答案 0 :(得分:12)
也许我的问题太过于字面意思,但是使用TWAIN API,无法检查设备是否已插入,即连接和开机。 TWAIN标准确实为此目的定义了一个称为CAP_DEVICEONLINE的功能,但是这个功能设计得很差,很少有驱动程序正确实现它,在实践中它是无用的。
最接近的是:打开设备(MSG_OPENDS):几乎所有驱动程序在打开时都会检查设备就绪,并向用户显示错误对话框。 没有用于抑制或检测此对话框的TWAIN机制某些驱动程序将允许用户更正问题并继续,在这种情况下,您(您的应用程序)将永远不会知道存在问题。一些驱动程序将允许用户取消,在这种情况下,MSG_OPENDS操作将失败,可能返回TWRC_CANCEL但可能是TWRC_FAILURE
即使设备处于脱机状态,一些TWAIN驱动程序也会毫无错误地打开。这样的驱动程序可能返回FALSE到CAP_DEVICEONLINE的查询。当您使用MSG_ENABLEDS启用设备时,这样的驱动程序可能会进行设备在线检查,然后如果设备不在线,则会向用户提供错误对话框,依此类推。
除了和IMPO:WIA“更现代”,但扫描的综合性也远不如TWAIN,而且我的经验无法用于文档进纸器的多页扫描。 WIA的设计师和维护者似乎不了解或关心除低端消费者平板之外的扫描仪。它对相机很有用。
答案 1 :(得分:2)
我开始使用从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");
}
}
}
我通常在单独的线程上启动扫描事件,以便在扫描过程中应用程序不会冻结。
答案 2 :(得分:1)
只需在TwainCommand(cmd)
上添加此代码即可case TwainCommand.Null:
{
EndingScan();
tw.CloseSrc();
Msgbox("There is no device or the scannning has been cancelled.");
break;
}
如果系统未检测到设备或扫描已被取消,则会出现此信息。
答案 3 :(得分:1)
您可以登记注册表。在:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f}
在子项中枚举了检测到的每个扫描程序。
从0000
开始,检查CreateFileName
值是空白还是有数据。
如果有数据,则它是已连接的扫描仪,如果它是空白的,则表示未连接。
答案 4 :(得分:-2)
我尝试这样做但是不能用TWAIN mybe尝试WIA
mybe试试这个:
on buton run scanner
timer1.Interval = 30000;
switch (cmd)
{
case TwainCommand.TransferReady:
{
..........
}
default:
{
timer1.Start();
break;
}
on event timer tick
{
EndingScan();
tw.CloseSrc();
}