/// <summary> /// Rollback the TWAIN state to whatever is requested... /// </summary> /// <param name="a_state"></param> public void Rollback(TWAIN.STATE a_state) { TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS); TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE); TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY); // Make sure we have something to work with... if (m_twain == null) { return; } // Walk the states, we don't care about the status returns. Basically, // these need to work, or we're guaranteed to hang... // 7 --> 6 if ((m_twain.GetState() == TWAIN.STATE.S7) && (a_state < TWAIN.STATE.S7)) { m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.ENDXFER, ref twpendingxfers); } // 6 --> 5 if ((m_twain.GetState() == TWAIN.STATE.S6) && (a_state < TWAIN.STATE.S6)) { m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.RESET, ref twpendingxfers); } // 5 --> 4 if ((m_twain.GetState() == TWAIN.STATE.S5) && (a_state < TWAIN.STATE.S5)) { m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.DISABLEDS, ref twuserinterface); } // 4 --> 3 if ((m_twain.GetState() == TWAIN.STATE.S4) && (a_state < TWAIN.STATE.S4)) { m_twain.CsvToIdentity(ref twidentity, m_twain.GetDsIdentity()); m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.CLOSEDS, ref twidentity); } // 3 --> 2 if ((m_twain.GetState() == TWAIN.STATE.S3) && (a_state < TWAIN.STATE.S3)) { m_twain.DatParent(TWAIN.DG.CONTROL, TWAIN.MSG.CLOSEDSM, ref m_intptrHwnd); } }
/// <summary> /// Select and open a TWAIN driver... /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void m_buttonOpen_Click(object sender, EventArgs e) { string szIdentity; string szDefault = ""; string szStatus; List <string> lszIdentity = new List <string>(); FormSelect formselect; DialogResult dialogresult; TWAIN.STS sts; TWAIN.TW_CAPABILITY twcapability; TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY); // Get the default driver... m_intptrHwnd = this.Handle; sts = m_twain.DatParent(TWAIN.DG.CONTROL, TWAIN.MSG.OPENDSM, ref m_intptrHwnd); if (sts != TWAIN.STS.SUCCESS) { MessageBox.Show("OPENDSM failed..."); return; } // Get the default driver... sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETDEFAULT, ref twidentity); if (sts == TWAIN.STS.SUCCESS) { szDefault = m_twain.IdentityToCsv(twidentity); } // Enumerate the drivers... for (sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETFIRST, ref twidentity); sts != TWAIN.STS.ENDOFLIST; sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETNEXT, ref twidentity)) { lszIdentity.Add(m_twain.IdentityToCsv(twidentity)); } // Ruh-roh... if (lszIdentity.Count == 0) { MessageBox.Show("There are no TWAIN drivers installed on this system..."); return; } // Instantiate our form... formselect = new FormSelect(lszIdentity, szDefault); formselect.StartPosition = FormStartPosition.CenterParent; dialogresult = formselect.ShowDialog(this); if (dialogresult != System.Windows.Forms.DialogResult.OK) { m_blExit = true; return; } // Get all the identities... szIdentity = formselect.GetSelectedDriver(); if (szIdentity == null) { m_blExit = true; return; } // Get the selected identity... m_blExit = true; foreach (string sz in lszIdentity) { if (sz.Contains(szIdentity)) { m_blExit = false; szIdentity = sz; break; } } if (m_blExit) { return; } // Make it the default, we don't care if this succeeds... twidentity = default(TWAIN.TW_IDENTITY); m_twain.CsvToIdentity(ref twidentity, szIdentity); m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twidentity); // Open it... sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.OPENDS, ref twidentity); if (sts != TWAIN.STS.SUCCESS) { MessageBox.Show("Unable to open scanner (it is turned on and plugged in?)"); m_blExit = true; return; } // Update the main form title... this.Text = "TWAIN C# Scan (" + twidentity.ProductName.Get() + ")"; // Strip off unsafe chars. Sadly, mono let's us down here... m_szProductDirectory = CSV.Parse(szIdentity)[11]; foreach (char c in new char [41] { '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F', '\x22', '\x3C', '\x3E', '\x7C', ':', '*', '?', '\\', '/' } ) { m_szProductDirectory = m_szProductDirectory.Replace(c, '_'); } // We're doing memory transfers... szStatus = ""; twcapability = default(TWAIN.TW_CAPABILITY); m_twain.CsvToCapability(ref twcapability, ref szStatus, "ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY"); sts = m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twcapability); if (sts != TWAIN.STS.SUCCESS) { m_blExit = true; return; } // Decide whether or not to show the driver's window messages... szStatus = ""; twcapability = default(TWAIN.TW_CAPABILITY); m_twain.CsvToCapability(ref twcapability, ref szStatus, "CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL," + (m_blIndicators ? "TRUE" : "FALSE")); sts = m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twcapability); if (sts != TWAIN.STS.SUCCESS) { m_blExit = true; return; } // New state... SetButtons(EBUTTONSTATE.OPEN); // Create the setup form... m_formsetup = new FormSetup(this, ref m_twain, m_szProductDirectory); }