/// <summary> /// 初始化扫描进程显示界面 /// 添加文件保存后台线程的三个回调方法 /// </summary> private void Init() { worker.DoWork += delegate(object s, DoWorkEventArgs args) { String fileSingleName; // 每次传输返回的文件名 //获取传输模式 TwMode mode = twSession.GetCurrentTransferMode(); switch (mode) { case TwMode.TWSX_FILE: transferFileAction = twSession.TransferSingleFileInFileMode; break; case TwMode.TWSX_NATIVE: transferFileAction = twSession.TransferSingleFileInNativeMode; break; default: break; } // 1:初始化GDI+ Gdip.InitGDIPlus(); //2:依次传输每个文件 logger.Debug("开始传输文件:" + DateTime.Now); if (transferFileAction != null) { int count = 0; try { do { logger.Debug("开始传输单个文件: count = " + count); //传输单个文件 transferResult = transferFileAction(fileType, out fileSingleName, resolution, out msg); logger.Debug("传输单个文件结束: result = " + transferResult); logger.Debug("开始结束一次传输过程。"); twSession.EndXfer(out count); logger.Debug("结束一次传输过程结束: count = " + count); //2.1:传输成功则检查文件大小 if (transferResult == TwRC.XferDone) { logger.Debug("得到一个传输文件: " + DateTime.Now); if (fileSingleName != null) { //A:判断读取的文件大小,零字节则不添加到列表中 FileInfo fileInfo = new FileInfo(fileSingleName); if (fileInfo.Length > blankSizeLimit && fileInfo.Length < maxImageSize) { cnt++; fileNames.Add(fileSingleName); worker.ReportProgress(fileNames.Count); logger.Debug("添加文件到列表,文件名: " + fileSingleName); //iacTwain.RaiseGetOnePageEvent(fileSingleName); } //B:否则删除文件 else { fileInfo.Delete(); logger.Info("删除太大或太小的扫描结果文件。"); } } else { logger.Debug("文件名为null。"); } } //2.2:传输失败则跳出循环 else { logger.Debug("传输失败,跳出循环。"); //if (count != 0) //如果扫描仪还有图像未传输,通知扫描仪清空 // twSession.ResetScanner(); break; } logger.Debug("结束传输单个文件: count = " + count); } while (count != 0 && count != -2); logger.Debug("结束循环 :" + DateTime.Now); } #region 异常处理 catch (ArgumentNullException e) { logger.Error("参数为空异常,异常信息: " + e.Message); } catch (ArgumentException e) { logger.Error("无效参数异常,异常信息: " + e.Message); } catch (System.Security.SecurityException e) { logger.Error("安全性错误引发的异常,异常信息: " + e.Message); } catch (UnauthorizedAccessException e) { logger.Error("IO错误或指定类型引发的安全性错误引发的异常,异常信息: " + e.Message); } catch (PathTooLongException e) { logger.Error("路径太长引发的异常,异常信息: " + e.Message); } catch (NotSupportedException e) { logger.Error("调用的方法不受支持或视图读取,查找或写入不支持调用功能的流引发的异常,异常信息: " + e.Message); } catch (IOException e) { logger.Error("IO异常,异常信息: " + e.Message); } catch (Exception e) { logger.Error("操作发生异常,异常信息: " + e.Message); } finally { Gdip.ClearGDIPlus(); } #endregion } }; worker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args) { buttonControl.Content = "已经扫描传输" + cnt + "页"; }; worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) { if (transferResult == TwRC.Failure) { MessageBox.Show("扫描失败:" + msg); } else { if (twSession.State >= TwState.OpenDS) { twSession.DisableDS(); } } if (transferResult == TwRC.TransferError) { MessageBox.Show("传输失败:" + msg); } if (transferResult == TwRC.BadValue) { MessageBox.Show("扫描仪当前设置不支持文件格式" + fileType + ",请重新设置"); } Close(); }; }
/// <summary> /// 系统消息处理函数 /// </summary> /// <param name="msg"></param> /// <param name="handled"></param> private void MessageFilter(ref System.Windows.Interop.MSG msg, ref bool handled) { //1:让TWAIN进行消息处理 TwainCommand cmd = twSession.PassMessageWPF(ref msg); messageLogger.Debug("TWAIN 信息 = " + cmd + ":" + DateTime.Now); if (cmd == TwainCommand.Not || cmd == TwainCommand.Null) // 非数据源消息 { handled = false; // 消息未处理,由窗口过程处理 return; } //2:进行消息处理 switch (cmd) { case TwainCommand.CloseRequest: { configFlag = false; EndingScan(); twSession.DisableDS(); break; } case TwainCommand.CloseOk: { configFlag = true; EndingScan(); twSession.DisableDS(); break; } case TwainCommand.DeviceEvent: { break; } //扫描仪传输就绪函数 case TwainCommand.TransferReady: { loadAndUnloadLogger.Debug("TWAIN 信息 = TransferReady " + DateTime.Now); ScanImageViewer scanViewer = null; try { if (ShowProgress) { //方式一:启动文件传输,弹出进度提示对话框 //获得文件格式 CapInfo capInfo; capInfo = twSession.GetScannerCap(TwCap.ICAP_IMAGEFILEFORMAT); string intStr = capInfo.CurrentIntStr; string enumStr = twSession.ConvertIntStringToEnumString(TwCap.ICAP_IMAGEFILEFORMAT, intStr); TwFileFormat fileFormat = (TwFileFormat)Enum.Parse(typeof(TwFileFormat), enumStr); //获取分辨率 capInfo = twSession.GetScannerCap(TwCap.ICAP_XRESOLUTION); Int32 resolution = Int32.Parse(capInfo.CurrentIntStr); // 获得空白页检测阈值 capInfo = twSession.GetScannerCap(TwCap.ICAP_AUTODISCARDBLANKPAGES); intStr = capInfo.CurrentIntStr; int blankImageSizeThreshold = 0; if (!Int32.TryParse(intStr, out blankImageSizeThreshold)) { blankImageSizeThreshold = 0; } scanViewer = new ScanImageViewer(twSession, userConfig.MaxSize, blankImageSizeThreshold, resolution, fileFormat); //生成显示控件对象 scanViewer.StartTransfer(); //开始图像传输 scanViewer.ShowDialog(); //展示显示控件 scanResultList = scanViewer.ScanFileNames; //获取文件传输过程中的列表 } else { //方式二:设置鼠标为等待状态,在相同线程中启动文件传输 Mouse.OverrideCursor = Cursors.Wait; TransferFiles(); } //发出扫描完成事件 logger.Debug("扫描完成 :" + DateTime.Now); RoutedEventArgs scanArgs = new RoutedEventArgs(ScanCompletedEvent); RaiseEvent(scanArgs); break; } catch (Exception e) { logger.Error("在MessageFilter中发生异常,异常信息; " + e.Message); } finally { if (scanViewer != null) { logger.Debug("关闭扫描仪。"); scanViewer.Close(); } //结束扫描 logger.Debug("结束扫描,使DS变为非使能状态。"); EndingScan(); twSession.DisableDS(); if (!ShowProgress) { //将鼠标复位 Mouse.OverrideCursor = null; } } break; } default: break; } handled = true; }