C#怎么使用Twain协议实现扫描仪连续扫描功能

C#怎么使用Twain协议实现扫描仪连续扫描功能

本篇内容主要讲解“C#怎么使用Twain协议实现扫描仪连续扫描功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用Twain协议实现扫描仪连续扫描功能”吧!

C#调用Twain接口实现扫描仪连续扫描。在监听的TwainCommand.TransferReady状态中,是调用扫描仪扫描图片的。我开始的时候尝试修改twain类中TransferPictures的方法,但是结果证实不可行。其实这是一个误区,我们只需要修改一下twain的启动扫描事件,可以根据是否连续扫描给扫描仪传不同的参数以达到此效果。 只需一行代码,就可实现一次扫描多张,且不需要更改扫描仪的任何设置。

C#怎么使用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协议实现扫描仪连续扫描功能”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

发布于 2022-01-14 22:34:36
收藏
分享
海报
0 条评论
36
上一篇:Python中如何实现文字成像方法 下一篇:如何用SpringCloud的OpenFeign进行服务调用
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码