有没有人尝试使用TwainDotNet从.NET的TWAIN API调用进行扫描?虽然它运行良好,但通常我在使用MVVM与WPF应用程序一起使用时遇到了一些问题。基本上,我从服务调用Twain扫描函数,而后者使用BackgroundWorker。TwainDotNet使用TWAIN与BackgroundWorker扫描
List<BitmapSource> bitmapSources = new List<BitmapSource>();
Twain twain = new Twain(new WpfWindowMessageHook(_window));
ScanSettings settings = new ScanSettings() { ShowTwainUI = false };
using (BackgroundWorker worker = new BackgroundWorker())
{
worker.DoWork += (sndr, evnt) =>
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
EventHandler scanCompleteHandler = (se, ev) => { waitHandle.Set(); };
twain.ScanningComplete += scanCompleteHandler;
twain.StartScanning(settings);
waitHandle.WaitOne();
if (twain.Images.Count > 0)
{
foreach (var image in twain.Images)
{
BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(new Bitmap(image).GetHbitmap(),
IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
bitmapSources.Add(bitmapSource);
}
}
};
worker.RunWorkerCompleted += (sndr, evnt) => { image1.Source = bitmapSources[0]; };
worker.RunWorkerAsync();
}
当我们使用BackgroundWorker时,ScanningComplete事件处理程序永远不会被触发。有任何建议来解决这个问题?
Raj,我从谷歌的TwainDotNet问题页面下载了您的示例项目。我想用backgroundworker做同样的事情,因为我想在扫描时在窗口上显示进度/状态。我在访问图像时遇到同样的问题。不过,我也无法在后台工作人员扫描时看到窗口作出回应。当您使用此解决方案进行扫描时,您是否能够让窗口更新/响应?请让我知道。 – Dave
Dave,样品溶液应该这样做对吗? – Raj
不,我想在窗口上放一个进度条并显示一些反馈。 DoWork正在处理扫描。所以,我需要另一个线程来报告进度。我启动了一个DispatcherTimer并调用: Dispatcher.Invoke(updatePbDelegate,System.Windows.Threading.DispatcherPriority.Background, new object [] {ProgressBar.ValueProperty,progressBarValue}); 但更新进度栏的事件在扫描完成之后才会触发。如果您有其他想法,请告诉我。 – Dave