C#使用Twain协议实现扫描仪连续扫描功能_第1页
C#使用Twain协议实现扫描仪连续扫描功能_第2页
C#使用Twain协议实现扫描仪连续扫描功能_第3页
C#使用Twain协议实现扫描仪连续扫描功能_第4页
C#使用Twain协议实现扫描仪连续扫描功能_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

如果用Twain协议实现一次扫描多张图片?相信有接触过Twain协议与扫描仪通信的朋友都遇到过这样的问题。按照网上的例子,在连续送纸的扫描仪中,调用一次却只能扫描一张图片,怎么破?

关于这个问题我研究了好久,终于在困扰了我7天之后,我搞定了,下面分享一下我的解决经验。

新建一个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)

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(obje

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论