Beispiel #1
0
        /// <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();
            };
        }
Beispiel #2
0
        /// <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;
        }