C#怎么使用Twain协议实现扫描仪连续扫描功能
C#怎么使用Twain协议实现扫描仪连续扫描功能
本篇内容主要讲解“C#怎么使用Twain协议实现扫描仪连续扫描功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用Twain协议实现扫描仪连续扫描功能”吧!
C#调用Twain接口实现扫描仪连续扫描。在监听的TwainCommand.TransferReady状态中,是调用扫描仪扫描图片的。我开始的时候尝试修改twain类中TransferPictures的方法,但是结果证实不可行。其实这是一个误区,我们只需要修改一下twain的启动扫描事件,可以根据是否连续扫描给扫描仪传不同的参数以达到此效果。 只需一行代码,就可实现一次扫描多张,且不需要更改扫描仪的任何设置。
新建一个ScanCommon类,在调用界面,写下调用扫描的方法:
ScanCommonscan=newRS_ScanCommon(fileName,this.Handle);scan.PassDataBetweenForm+=newRS_ScanCommon.PassDataBetweenFormHandler(scan_PassDataBetweenForm);//是否连续扫描scan.bContinuousScan=true;scan.dtRow=dtRow;this.Enabled=false;scan.StartScan();
在ScanCommon类中,调用Twain的接口类(Twain类网络上可以找到,本文略),主要代码如下:
//添加一个委托publicdelegatevoidPassDataBetweenFormHandler(objectsender,PassDataEventArgse);//添加一个PassDataBetweenFormHandler类型的事件publiceventPassDataBetweenFormHandlerPassDataBetweenForm;publicScanCommon(stringfileName,IntPtrHandle){this.fileName=fileName;this.Handle=Handle;//扫描初始化(默认使用TWAIN方式进行连接)tw=newTwain();tw.Init(Handle,outrc);//tw.Select();}//启动扫描publicvoidStartScan(){if(rc!=TwRC.Success){MessageBox.Show("设备初始化失败,请检查硬件及驱动!");}else{stringpath="XXX路径"+"\\ScannerFile\\"+frmName;if(Scanning(path)==false){MessageBox.Show("设备未找到或设备不支持TWAIN组件,无法自动创建扫描任务。");//回调主窗口PassDataEventArgsargs=newPassDataEventArgs("exit");PassDataBetweenForm(this,args);GC.Collect();}}}
在ScanCommon类中,主要的扫描方法均可以通过调用twain类实现,Scanning是调用驱动实现扫描的方法。Application.AddMessageFilter是添加扫描仪的事件监听,在监听事件中返回扫描仪的不同状态以实现取消和扫描的一些操作。
主要代码如下:
#region扫描的一些方法privateboolScanning(stringfilePath){if(!msgfilter){msgfilter=true;Application.AddMessageFilter(this);}ScanPath=filePath;returntw.Acquire(refstrScanErrorMessage,bContinuousScan);}///<summary>///保存图片///</summary>///<paramname="dibhandp"></param>privatevoidImageSave(IntPtrdibhandp){bmprect=newRectangle(0,0,0,0);if(dibhandp!=IntPtr.Zero)dibhand=dibhandp;bmpptr=GlobalLock(dibhand);pixptr=GetPixelInfo(bmpptr);}publicvoidEndingScan(){if(msgfilter){tw.Finish();RemoveMessageFilter(this);msgfilter=false;}}publicstaticvoidRemoveMessageFilter(IMessageFiltervalue){Application.RemoveMessageFilter(value);}#endregion
在监听的TwainCommand.TransferReady状态中,是调用扫描仪扫描图片的。我开始的时候尝试修改twain类中TransferPictures的方法,但是结果证实不可行。
其实这是一个误区,我们只需要修改一下twain的启动扫描事件,可以根据是否连续扫描给扫描仪传不同的参数以达到此效果。
只需一行代码,就可实现一次扫描多张,且不需要更改扫描仪的任何设置。
如果设备支持连续送纸,启动扫描时扫描仪会直接连扫直到纸张全部扫完
//此行代码是连续扫描TwCapabilitycap=newTwCapability(TwCap.XferCount,-1);
代码如下:
///<summary>///启动扫描///</summary>///<paramname="strScanErrorMessage"></param>///<returns></returns>publicboolAcquire(refstringstrScanErrorMessage,boolMultiScan){try{TwRCrc;CloseSrc();if(appid.Id==IntPtr.Zero){Init(hwnd,outrc);if(appid.Id==IntPtr.Zero)strScanErrorMessage="未找到扫描仪设备,请查看是否安装扫描仪驱动!";returnfalse;}rc=DSMident(appid,IntPtr.Zero,TwDG.Control,TwDAT.Identity,TwMSG.OpenDS,srcds);if(rc!=TwRC.Success){strScanErrorMessage="未找到扫描仪设备";returnfalse;}if(MultiScan){//如果是连续扫描TwCapabilitycap=newTwCapability(TwCap.XferCount,-1);rc=DScap(appid,srcds,TwDG.Control,TwDAT.Capability,TwMSG.Set,cap);}else{//否则只扫描一张TwCapabilitycap=newTwCapability(TwCap.XferCount,1);rc=DScap(appid,srcds,TwDG.Control,TwDAT.Capability,TwMSG.Set,cap);}if(rc!=TwRC.Success){strScanErrorMessage="未找到扫描仪设备";CloseSrc();returnfalse;}TwUserInterfaceguif=newTwUserInterface();guif.ShowUI=1;guif.ModalUI=1;guif.ParentHand=hwnd;rc=DSuserif(appid,srcds,TwDG.Control,TwDAT.UserInterface,TwMSG.EnableDS,guif);if(rc!=TwRC.Success){strScanErrorMessage="扫描仪中没有纸";CloseSrc();GC.Collect();returnfalse;}}catch(Exceptione){strScanErrorMessage=e.Message;GC.Collect();returnfalse;}GC.Collect();returntrue;}
扫描结束后,回调主窗口返回数据,主窗口添加如下事件:
privatevoidscan_PassDataBetweenForm(objectsender,PassDataEventArgse){if(e.EventStr=="exit"){this.Cursor=Cursors.WaitCursor;frm.dtRow=this.dtRow;//处理图片的一些方法....this.Enabled=true;this.Cursor=Cursors.Default;GC.Collect();}}
到此,相信大家对“C#怎么使用Twain协议实现扫描仪连续扫描功能”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!