如何检查扫描仪是否已插入(C#,。NET TWAIN)
我在我的应用程序中使用https://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_MACHINESYSTEMCurrentControlSetControlClass{6bdd1fc6-810f-11d0-bec7-08002be2092f}
每个检测到的扫描程序都在子项中枚举。
从0000
开始,检查CreateFileName
值是空白还是有数据。
如果它有数据,则它是连接的扫描仪,如果它是空白的,则它没有连接。
我尝试这样做但是不能用TWAIN mybe尝试WIA
mybe尝试这个:
在buton运行扫描仪
timer1.Interval = 30000; switch (cmd) { case TwainCommand.TransferReady: { .......... } default: { timer1.Start(); break; }
在事件计时器滴答
上述就是C#学习教程:如何检查扫描仪是否已插入(C#,。NET TWAIN)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
{ EndingScan(); tw.CloseSrc(); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1034149.html