如何检查扫描仪是否已插入(C#,。NET TWAIN)

我在我的应用程序中使用http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx中的.NET TWAIN代码。 当我没有插入扫描仪时尝试扫描图像时,应用程序会冻结。

如何使用TWAIN驱动程序检查设备是否已插入?

也许我的问题太过于字面意思,但是使用TWAIN API,无法检查设备是否已插入,即连接和打开电源。 TWAIN标准确实为此目的定义了一个名为CAP_DEVICEONLINE的function,但是这个function设计得很差,很少有驱动程序正确实现它在实践中没用。

最接近的是:打开设备(MSG_OPENDS):几乎所有驱动程序在打开时都会检查设备就绪,并向用户显示错误对话框。 没有用于抑制或检测此对话框的TWAIN机制某些驱动程序将允许用户更正问题并继续,在这种情况下,您(您的应用程序)将永远不会知道存在问题。 一些驱动程序将允许用户取消,在这种情况下MSG_OPENDS操作将失败,可能返回TWRC_CANCEL但可能是TWRC_FAILURE

即使设备处于脱机状态,一些TWAIN驱动程序也会毫无错误地打开。 这样的驱动程序可能会返回FALSE到CAP_DEVICEONLINE的查询。 当您使用MSG_ENABLEDS启用设备时,此类驱动程序可能会执行设备联机检查,然后如果设备未联机,则会向用户显示错误对话框,依此类推。

除了和IMPO:WIA“更现代”,但扫描的全面性不如TWAIN,而且我的经验无法用于文档进纸器的多页扫描。 WIA的设计师和维护者似乎不了解或关心低端消费平板以外的扫描仪。 这对相机很有用。

我开始使用从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"); } } } 

我通常在单独的线程上启动扫描事件,以便在扫描过程中应用程序不会冻结。

只需在TwainCommand(cmd)上添加此代码

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

如果系统检测不到设备或扫描已取消,则会出现此信息。

您可以登记注册表。 在:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f}每个检测到的扫描程序都在子项中枚举。

0000开始,检查CreateFileName值是空白还是有数据。

如果它有数据,则它是连接的扫描仪,如果它是空白的,则它没有连接。

我尝试这样做但是不能用TWAIN mybe尝试WIA

mybe尝试这个:

在buton运行扫描仪

 timer1.Interval = 30000; switch (cmd) { case TwainCommand.TransferReady: { .......... } default: { timer1.Start(); break; } 

在事件计时器滴答

 { EndingScan(); tw.CloseSrc(); }