我使用从.NET TWAIN代码http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx在我的应用程序。 当我尝试扫描图像时,扫描仪未插好,申请冻结。
我如何检查设备插入时,使用TWAIN驱动程序?
我使用从.NET TWAIN代码http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx在我的应用程序。 当我尝试扫描图像时,扫描仪未插好,申请冻结。
我如何检查设备插入时,使用TWAIN驱动程序?
也许我走的问题望文生义,但使用TWAIN API,它是不可能的检查设备是否在IE连接插入并打开电源。 该TWAIN标准并定义了用于此目的称为CAP_DEVICEONLINE能力,不过这个功能是如此考虑不周等少数驱动程序正确地执行它,这是在实践中无用的。
你可以得到的最接近的是这样的:打开设备(MSG_OPENDS):几乎所有的司机将检查设备准备就绪,当他们被打开,并且会显示一个错误对话框给用户。 有抑制或检测此对话框有些司机将允许用户纠正问题并继续,在这种情况下,你(你的应用程序)将永远不会知道有一个问题没有TWAIN机制 。 有些司机将允许用户取消,在这种情况下MSG_OPENDS操作将失败,可能返回TWRC_CANCEL但也许TWRC_FAILURE
即使该设备是离线的一些TWAIN驱动程序将不会出现错误打开。 这样的驱动程序可能会返回FALSE来CAP_DEVICEONLINE的查询。 这样的驱动程序可能会做设备网上办理登机手续时,您启用MSG_ENABLEDS的设备,然后如果该设备是不上网,你的错误对话框给用户,等等如上。
除了和IMPO:WIA是“更现代的”,但也为扫描比TWAIN少得多全面,以我的经验不能用于从文档进纸器多页扫描。 WIA的设计师和维护者似乎并不了解或关心比低端消费平板车其他扫描仪。 这是很好的相机。
我开始与你从CodeProject下载相同的源代码,但移动了大部分的代码在启动扫描到扫描仪类MainFrame.cs。 为了检查扫描错误,我呼吁在直接调用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试试这个:
在布顿运行扫描仪
timer1.Interval = 30000;
switch (cmd)
{
case TwainCommand.TransferReady:
{
..........
}
default:
{
timer1.Start();
break;
}
事件计时器滴答
{
EndingScan();
tw.CloseSrc();
}