Использую библиотеку NTWAIN, написал класс, чтобы с ней работать, вот он:
public class ScanningTwain
{
private static readonly TWIdentity TwainAppId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetEntryAssembly());
private List<System.Drawing.Image> lesImagesNum;
EventWaitHandle session_SourceDisable_Wait;
TwainSession session;
DataSource myDS;
public event EventHandler ScanDone;
private EventArgs arg;
private void OnScanDone() { if (ScanDone != null) { ScanDone(this, arg); } }
public List<System.Drawing.Image> listImages
{
get { return lesImagesNum; }
}
public ScanningTwain()
{
lesImagesNum = new List<System.Drawing.Image>();
}
void session_SourceDisable(object sender, EventArgs e)
{
myDS.Close();
session.Close();
}
void session_DataTransferred(object sender, NTwain.DataTransferredEventArgs e)
{
if (e.NativeData != IntPtr.Zero)
{
System.Drawing.Image img = null;
var stream = e.GetNativeImageStream();
if (stream != null)
{
img = System.Drawing.Image.FromStream(stream);
}
if (img != null)
{
lesImagesNum.Add(img);
}
}
session_SourceDisable_Wait.Set();
OnScanDone();
}
public void Scan(decimal dpi)
{
lesImagesNum.Clear();
var appId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetExecutingAssembly());
session = new TwainSession(appId);
session.DataTransferred += session_DataTransferred;
session.SourceDisabled += session_SourceDisable;
session.Open();
myDS = session.ShowSourceSelector();
myDS.Open();
PixelType typeCouleur = PixelType.Gray;
if (myDS.Capabilities.ICapPixelType.CanSet &&
myDS.Capabilities.ICapPixelType.GetValues().Contains(typeCouleur))
{
myDS.Capabilities.ICapPixelType.SetValue(typeCouleur);
}
TWFix32 DPI = (int)dpi;
if (myDS.Capabilities.ICapXResolution.CanSet &&
myDS.Capabilities.ICapXResolution.GetValues().Contains(DPI))
{
myDS.Capabilities.ICapXResolution.SetValue(DPI);
}
if (myDS.Capabilities.ICapYResolution.CanSet &&
myDS.Capabilities.ICapYResolution.GetValues().Contains(DPI))
{
myDS.Capabilities.ICapYResolution.SetValue(DPI);
}
myDS.Enable(SourceEnableMode.ShowUI, false, System.IntPtr.Zero);
session_SourceDisable_Wait = new EventWaitHandle(false, EventResetMode.AutoReset);
session_SourceDisable_Wait.WaitOne();
}
}
Начинает не работать в момент когда происходит сканирование - происходит бесконечная загрузка (вечно крутящееся колесо загрузки) и все. Видимо неправильно отрабатывается завершение сканирования. Буду очень признателен, если подскажите в чем причина. Вот участок кода где я вызываю сканирование из этого класса:
private void bСканирование_Click(object sender, DoWorkEventArgs e)
{
scanningTwain = new ScanningTwain();
scanningTwain.ScanDone += scanningTwain_ScanDone;
scanningTwain.Scan(dpi);
}
private void scanningTwain_ScanDone(object sender, EventArgs e)
{
listImge = new List<Image>();
listImge = scanningTwain.listImages;
...
}