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原创,署名小萝卜。转载请注明出处。谢谢!