2008-09-19 80 views

回答

12

也许我从字面上理解了这个问题,但是使用TWAIN API时,无法检查设备是否已插入,即已连接并通电。 TWAIN标准确实为此目的定义了一种称为CAP_DEVICEONLINE的功能,但这一功能构思得很差,因此很少有驱动程序正确实施,因此在实践中无用。

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

即使设备处于脱机状态,几个TWAIN驱动程序也会打开而不会出错。这样的驱动程序可能会返回FALSE以查询CAP_DEVICEONLINE。当你使用MSG_ENABLEDS启用设备时,这样的驱动程序可能会执行设备在线检查,然后如果设备不在线,则会向用户提供错误对话框,依此类推。除了TWAIN之外,WIA是'更现代化'的,但是对于扫描的综合性要差得多,而且根据我的经验,它无法从文档进纸器进行多页扫描。 WIA的设计师和维护人员似乎不理解或关心低端消费平板以外的扫描仪。这对相机很好。

+0

+1解释的东西 – 2014-09-30 07:06:30

2

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

我通常开始于一个单独的线程扫描事件,以使应用程序不冻结,而正在扫描进展。

1

只需添加此代码对你TwainCommand(CMD)

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

如果系统检测到任何设备或扫描已被取消,这将出现。

-2

我尝试这样做,但不工作的好与TWAIN mybe尝试WIA

mybe试试这个:

上布顿运行扫描仪

timer1.Interval = 30000; 

switch (cmd) 
{ 
case TwainCommand.TransferReady: 

{ 
.......... 
} 

default: 

{ 
timer1.Start(); 
break; 
} 

事件计时器滴答

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

这看起来更像是一个猜测而不是答案。并在此不正确的猜测。 – 2012-05-24 17:12:20

1

您可以检查注册表。在:

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

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

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

+0

不幸的是,一些扫描仪向TWAIN报告一个名称,但在注册表中显示为不同的名称。不过这个技巧有时会起作用。 – piedar 2016-12-07 15:30:55