8

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

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

4

5 回答 5

12

也许我的问题过于字面化了,但是使用 TWAIN API,无法检查设备是否已插入,即已连接并打开电源。TWAIN 标准确实为此目的定义了一种称为 CAP_DEVICEONLINE 的功能,但该功能的构思非常糟糕,并且很少有驱动程序正确实现它,因此在实践中它是无用的。

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

即使设备处于脱机状态,一些 TWAIN 驱动程序也会正常打开。这样的驱动程序可能会向 CAP_DEVICEONLINE 查询返回 FALSE。当您使用 MSG_ENABLEDS 启用设备时,这样的驱动程序可能会执行设备在线检查,然后如果设备不在线,您会收到错误对话框给用户,依此类推。

除了 IMPO:WIA 比 TWAIN 更“现代”,但扫描的全面性也远不如 TWAIN,而且根据我的经验,它无法用于从文档进纸器进行多页扫描。WIA 的设计人员和维护人员似乎不了解或关心除低端消费平板之外的扫描仪。这对相机有好处。

于 2008-10-10T22:12:19.277 回答
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");
        }
    }
}

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

于 2008-10-01T08:23:13.863 回答
1

只需将此代码添加到您的 TwainCommand (cmd)

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

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

于 2009-06-24T03:49:57.823 回答
1

您可以在注册表中检查。在:

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

从 开始0000,检查该CreateFileName值是否为空白或有数据。

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

于 2014-12-18T05:28:13.833 回答
-2

我尝试这样做,但不适用于 TWAIN mybe 尝试 WIA

我试试这个:

在按钮上运行扫描仪

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}

在事件计时器滴答声上

{
EndingScan();
tw.CloseSrc();
}
于 2010-04-24T18:51:55.863 回答