如何检查扫描仪是不是已插入(C#、.NET TWAIN)

Posted

技术标签:

【中文标题】如何检查扫描仪是不是已插入(C#、.NET TWAIN)【英文标题】:How do I check if the scanner is plugged in (C#, .NET TWAIN)如何检查扫描仪是否已插入(C#、.NET TWAIN) 【发布时间】:2010-09-11 03:30:56 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

也许我的问题过于字面化了,但是使用 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 的设计人员和维护人员似乎不了解或关心除低端消费平板之外的扫描仪。这对相机很有用。

【讨论】:

【参考方案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");
        
    

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

您可以检查注册表。在:

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

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

如果有数据,则为已连接的扫描仪,如果为空白,则未连接。

【讨论】:

不幸的是,一些扫描仪向 TWAIN 报告一个名称,但在注册表中显示为不同的名称。不过,这个技巧有时确实有效。【参考方案5】:

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

我可以试试这个:

在按钮上运行扫描仪

timer1.Interval = 30000;

switch (cmd)

case TwainCommand.TransferReady:


..........


default:


timer1.Start();
break;

事件计时器滴答声


EndingScan();
tw.CloseSrc();

【讨论】:

这看起来更像是猜测而不是答案。还有一个错误的猜测。

以上是关于如何检查扫描仪是不是已插入(C#、.NET TWAIN)的主要内容,如果未能解决你的问题,请参考以下文章

C# WinAPI 从静态检查窗口文本

C#:如何以编程方式检查 Web 服务是不是已启动并正在运行?

C# 检查已安装的 .NET Framework 和 MS Visual C++ Redist 版本

如何检查扫描后是不是生成了 ZAP 报告/警报?

ASP.net (C#)如何检查数据库内容是不是更新?

扫描上传的文件 C# ASP.net