Domanda

Sto usando il .NET TWAIN codice http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx nella mia applicazione.Quando cerco di eseguire la scansione di un'immagine quando lo scanner non è collegato, l'applicazione si blocca.

Come posso controllare se il dispositivo è collegato, tramite il driver TWAIN?

È stato utile?

Soluzione

Forse sto prendendo la questione troppo alla lettera, ma utilizzando il driver TWAIN, API, non è possibile verificare se un dispositivo è collegato cioècollegato e acceso.TWAIN standard definisce una capacità di scopo denominata CAP_DEVICEONLINE, ma questa funzione è così mal concepita e così pochi driver implementare correttamente che è inutile nella pratica.

Il più vicino si può ottenere è questo:Aprire il dispositivo (MSG_OPENDS):Quasi tutti i driver di controllo per il dispositivo pronto per quando sono aperti, e verrà visualizzata una finestra di errore all'utente. Non c'è TWAIN meccanismo per la soppressione o la rilevazione di questa finestra di dialogo Alcuni driver per consentire all'utente di risolvere il problema e continuare, nel qual caso si (app) non verrà mai a sapere che c'era un problema.Alcuni driver di permettere all'utente di cancellare, in questo caso il MSG_OPENDS operazione ha esito negativo, probabilmente di ritorno TWRC_CANCEL ma forse TWRC_FAILURE

Alcuni driver TWAIN verrà aperto senza errore, anche se il dispositivo è off-line.Tali driver può return FALSE per una query di CAP_DEVICEONLINE.Tali driver, probabilmente farà il dispositivo-il check-in online quando si attiva il dispositivo con MSG_ENABLEDS, e quindi se il dispositivo non è on-line, si ottiene la finestra di dialogo di errore per l'utente, e quindi come sopra.

Da parte e IMPO:WIA è 'più moderna, ma anche molto meno completo per la scansione di TWAIN, e nella mia esperienza inutilizzabile per la scansione di più pagine da un documento nell'alimentatore.WIA progettisti e manutentori sembrano non capire o preoccuparsi scanner diverse da quelle a basso consumo di cassoni fissi.È buono per le telecamere.

Altri suggerimenti

Ho iniziato con lo stesso codice sorgente che hai scaricato dal CodeProject, ma spostato la maggior parte del codice nel MainFrame.cs che avvia la scansione con uno Scanner di classe.Per verificare la scansione errori che io chiamo il metodo riportato di seguito in vece di chiamare Twain.Acquisire direttamente:

enum AcquireResult
{
    OK = 0,
    InitFailed = 1,
    DeviceIDFailed = 2,
    CapabilityFailed = 3,
    UserInterfaceError = 4
}
private void StartScan()
{
    if (!_msgFilter)
    {
        _parent.Enabled = false;
        _msgFilter = true;
        Application.AddMessageFilter(this);
    }
    AcquireResult ar = _twain.Acquire();
    if (ar != AcquireResult.OK)
    {
        EndingScan();
        switch (ar)
        {
            case AcquireResult.CapabilityFailed:
                throw new Exception("Scanner capability setup failed");
            case AcquireResult.DeviceIDFailed:
                throw new Exception("Unable to determine device identity");
            case AcquireResult.InitFailed:
                throw new Exception("Scanner initialisation failed");
            case AcquireResult.UserInterfaceError:
                throw new Exception("Error with the Twain user interface");
            default:
                throw new Exception("Document scanning failed");
        }
    }
}

Io di solito avviare la scansione evento su un thread separato in ordine per l'app per non congelare, mentre la scansione è in corso.

basta aggiungere questo codice sul tuo TwainCommand (cmd)

case TwainCommand.Null:
    {
     EndingScan();
     tw.CloseSrc();
             Msgbox("There is no device or the scannning has been cancelled.");
     break;
    }

questo verrà visualizzato se il sistema rileva nessun dispositivo o la scansione è stata annullata.

È possibile controllare nel registro di sistema.In:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} ogni scanner è mai stata rilevata viene enumerato c'nelle sottochiavi.

A partire 0000, passare attraverso e controllare se il CreateFileName il valore è vuoto o ha dati.

Se si dispone di dati, si tratta di uno scanner collegato, se è vuoto, che non è collegato.

cerco di fare questo, ma non funzionano bene con TWAIN mybe provare WIA

mybe provare questo:

sul pulsante avvia pulizia

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

{
..........
}

default:

{
timer1.Start();
break;
}

evento tick del timer

{
EndingScan();
tw.CloseSrc();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top