C#:使用Twain协议实现扫描仪连续扫描(转自https://www.cnblogs.com/healer007/p/6240730.html)
如果用Twain协议实现一次扫描多张图片?相信有接触过Twain协议与扫描仪通信的朋友都遇到过这样的问题。按照网上的例子,在连续送纸的扫描仪中,调用一次却只能扫描一张图片,怎么破?
关于这个问题 我研究了好久,终于在困扰了我7天之后,我搞定了,下面分享一下我的解决经验。
新建一个ScanCommon类,在调用界面,写下调用扫描的方法:

1 ScanCommon scan = new RS_ScanCommon(fileName, this.Handle); 2 scan.PassDataBetweenForm += new RS_ScanCommon.PassDataBetweenFormHandler(scan_PassDataBetweenForm); 3 4 //是否连续扫描 5 scan.bContinuousScan = true; 6 scan.dtRow = dtRow; 7 this.Enabled = false; 8 scan.StartScan();

在ScanCommon类中,调用Twain的接口类(Twain类网络上可以找到,本文略),主要代码如下:


// 添加一个委托
public delegate void PassDataBetweenFormHandler(object sender, PassDataEventArgs e);
// 添加一个PassDataBetweenFormHandler 类型的事件
public event PassDataBetweenFormHandler PassDataBetweenForm;
public ScanCommon(string fileName, IntPtr Handle)
{
this.fileName = fileName;
this.Handle = Handle;
//扫描初始化(默认使用TWAIN方式进行连接)
tw = new Twain();
tw.Init(Handle, out rc);
//tw.Select();
}
//启动扫描
public void StartScan()
{
if (rc != TwRC.Success)
{
MessageBox.Show("设备初始化失败,请检查硬件及驱动!");
}
else
{
string path = "XXX路径" + "\\ScannerFile\\" + frmName;
if (Scanning(path) == false)
{
MessageBox.Show("设备未找到或设备不支持TWAIN组件,无法自动创建扫描任务。") ;
//回调主窗口
PassDataEventArgs args = new PassDataEventArgs("exit");
PassDataBetweenForm(this, args);
GC.Collect();
}
}
}

在ScanCommon类中,主要的扫描方法均可以通过调用twain类实现,Scanning是调用驱动实现扫描的方法。Application.AddMessageFilter是添加扫描仪的事件监听,在监听事件中返回扫描仪的不同状态以实现取消和扫描的一些操作。
主要代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
在监听的TwainCommand.TransferReady状态中,是调用扫描仪扫描图片的。我开始的时候尝试修改twain类中TransferPictures的方法,但是结果证实不可行。
其实这是一个误区,我们只需要修改一下twain的启动扫描事件,可以根据是否连续扫描给扫描仪传不同的参数以达到此效果。
只需一行代码,就可实现一次扫描多张,且不需要更改扫描仪的任何设置。
如果设备支持连续送纸,启动扫描时扫描仪会直接连扫直到纸张全部扫完
| 1 |
|
代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
扫描结束后,回调主窗口返回数据,主窗口添加如下事件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
特别声明:本文由Healer007原创,署名小萝卜。转载请注明出处。谢谢!
本文介绍了使用C#和Twain协议实现扫描仪连续扫描的方法。作者针对调用一次只能扫描一张图片的问题,研究出解决方案。通过新建ScanCommon类,调用Twain接口类,修改启动扫描事件传参,一行代码即可实现一次扫描多张,扫描结束后回调主窗口返回数据。


被折叠的 条评论
为什么被折叠?



