如何用C#控制twain。dll实时接收扫描完的信息,而不是一次扫描的信息一次回传

qxl3915315 2015-04-22 08:56:14
现在用C#写了控制twain.dll的方法,借鉴了大神的代码,但现在出现了一个问题,现在数据的回传方式是通过windows监听系统消息来完成,在扫描仪完成一次扫描之后(不管是一张,2张,还是更多),扫描仪没有待扫描的文件后,才返回可以接受信息的信号,大大的延迟了
有没有办法,实现扫描仪扫描完一张就即使返回数据,也就是每扫描完一张返回一次数据,跪求大神帮忙解惑 ,现有的代码如何

bool IMessageFilter.PreFilterMessage(ref Message m)
{
TwainCommand cmd = tw.PassMessage(ref m);
if (cmd == TwainCommand.Not)
return false;

switch (cmd)
{
case TwainCommand.CloseRequest:
{
EndingScan();
tw.CloseSrc();
break;
}
case TwainCommand.CloseOk:
{
EndingScan();
tw.CloseSrc();
break;
}
case TwainCommand.DeviceEvent:
{
break;
}
case TwainCommand.TransferReady:
{
ArrayList pics = tw.TransferPictures();
picnumber++;
//图像处理方法
}
break;
}
}

return false;
}


/// <summary>
/// 传递消息
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public TwainCommand PassMessage(ref Message m)
{
if (srcds.Id == IntPtr.Zero)
return TwainCommand.Not;

int pos = GetMessagePos();

winmsg.hwnd = m.HWnd;
winmsg.message = m.Msg;
winmsg.wParam = m.WParam;
winmsg.lParam = m.LParam;
winmsg.time = GetMessageTime();
winmsg.x = (short)pos;
winmsg.y = (short)(pos >> 16);

Marshal.StructureToPtr(winmsg, evtmsg.EventPtr, false);
evtmsg.Message = 0;
TwRC rc = DSevent(appid, srcds, TwDG.Control, TwDAT.Event, TwMSG.ProcessEvent, ref evtmsg);


if (rc == TwRC.NotDSEvent)
return TwainCommand.Not;
if (evtmsg.Message == (short)TwMSG.XFerReady)
return TwainCommand.TransferReady;
if (evtmsg.Message == (short)TwMSG.CloseDSReq)
return TwainCommand.CloseRequest;
if (evtmsg.Message == (short)TwMSG.CloseDSOK)
return TwainCommand.CloseOk;
if (evtmsg.Message == (short)TwMSG.DeviceEvent)
return TwainCommand.DeviceEvent;



return TwainCommand.Null;
}
...全文
840 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ys_55327 2016-03-07
  • 打赏
  • 举报
回复
你现在能不显示 用户界面来设置扫描仪的参数? 比如分辨率和扫描的是彩色,黑白还是灰度?
_小黑_ 2016-03-07
  • 打赏
  • 举报
回复
这个 不需要 采用 windows 监听 吧 twain 都是 扫描一张 保存一张的
ys_55327 2015-12-17
  • 打赏
  • 举报
回复
你能共享一下代码吗,我现在也在做twain扫描仪 ,你有找到那个twain扫描仪控件吗,你用的是那个dll文件啊?
全栈极简 2015-08-09
  • 打赏
  • 举报
回复
这个我曾经使用过,本来就是扫描一张保存一张图片的。 http://www.codeproject.com/Articles/1376/NET-TWAIN-image-scanner
  • 打赏
  • 举报
回复
从你贴出的代码,什么主要逻辑都看不出。既然你贴不出主要的逻辑,我就知道你为什么会提出这个问题了。建议你找会调用这个代码的、当初的程序员来重新设计程序。你贴出的代码根本没有你的问题所涉及的部分的逻辑。 我给你打一个比方,你就明白我给你的是什么提示。比如说有一个土石方工程需要3个拖拉机操作,你现在问“请问怎样才能让3个拖垃圾合理安排工作进度而不相互影响使用?”,然后你就贴出了3台拖拉机的操作说明书。你贴出这种说明书,说明你根本不是能够负责土石方工程的那几个人之一,而只是临时找来的。
c212610 2015-08-09
  • 打赏
  • 举报
回复
这个问题很值得解决啊,工作效率能够大大的提升,同样求解,现金答谢,请私信我
qxl3915315 2015-04-23
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
即使不是PDF格式,而是tif图片格式 你通信的时候也是要把图片都弄出来,再比对哪些曾经读取过了,哪些没有读取过 难道有方法只读取刚刚扫描的文件? 等文件完整了一次性读取不是更有效率吗
现在是要做一个,试卷扫描系统,扫描仪上放置一沓试卷,扫描完一张 ,程序接收数据,对接收的数据进行处理,这样扫描到有问题的试卷可以及时处理,而不用等待所有扫描完了再处理
於黾 2015-04-23
  • 打赏
  • 举报
回复
即使不是PDF格式,而是tif图片格式 你通信的时候也是要把图片都弄出来,再比对哪些曾经读取过了,哪些没有读取过 难道有方法只读取刚刚扫描的文件? 等文件完整了一次性读取不是更有效率吗
於黾 2015-04-23
  • 打赏
  • 举报
回复
晕. 扫描仪扫描完,不是保存成PDF格式吗 每扫描一张就去获取文件是要闹哪样,文件根本不完整啊
qxl3915315 2015-04-23
  • 打赏
  • 举报
回复
怎么没人,求大神,求帮顶,自己顶
qxl3915315 2015-04-22
  • 打赏
  • 举报
回复
怎么没人,求大神,求帮顶,自己顶

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧