Question

J'utilise le code .NET TWAIN de http : //www.codeproject.com/KB/dotnet/twaindotnet.aspx? msg = 1007385 # xx1007385xx dans mon application. Lorsque j'essaie de numériser une image alors que le scanner n'est pas branché, l'application se fige.

Comment puis-je vérifier si le périphérique est branché à l'aide du pilote TWAIN?

Était-ce utile?

La solution

Peut-être que je prends la question trop à la lettre, mais en utilisant l'API TWAIN, il n'est pas possible de vérifier si un périphérique est branché, c'est-à-dire connecté et sous tension. La norme TWAIN définit à cet effet une fonctionnalité appelée CAP_DEVICEONLINE, mais cette fonctionnalité est si mal conçue et si peu de pilotes l’implémentent correctement qu’elle est inutile en pratique.

Voici ce que vous pouvez obtenir de plus près: Ouvrez le périphérique (MSG_OPENDS): Presque tous les pilotes vérifieront que le périphérique est prêt à leur ouverture et afficheront une boîte de dialogue d'erreur à l'intention de l'utilisateur. Il n'y a pas de mécanisme TWAIN pour supprimer ou détecter cette boîte de dialogue Certains pilotes permettront à l'utilisateur de corriger le problème et de continuer, auquel cas vous (votre application) ne saurez jamais qu'il y a eu un problème. Certains pilotes autoriseront l'utilisateur à annuler, auquel cas l'opération MSG_OPENDS échouera, retournant probablement TWRC_CANCEL mais peut-être TWRC_FAILURE

Quelques pilotes TWAIN s'ouvriront sans erreur même si le périphérique est hors ligne. Un tel pilote peut renvoyer FALSE à une requête de CAP_DEVICEONLINE. Un tel pilote effectuera probablement la vérification du périphérique en ligne lorsque vous activez le périphérique avec MSG_ENABLEDS. Par la suite, si le périphérique n'est pas en ligne, la boîte de dialogue d'erreur s'affiche pour l'utilisateur, et ainsi de suite.

Outre et IMPO: WIA est "plus moderne" mais également beaucoup moins complet que TWAIN pour la numérisation et, selon mon expérience, inutilisable pour la numérisation de plusieurs pages à partir d'un chargeur de documents. Les concepteurs et les responsables de la maintenance de WIA ne semblent pas comprendre ni se soucier des scanners autres que les ordinateurs à fond plat destinés aux consommateurs bas de gamme. C'est bon pour les caméras.

Autres conseils

J'ai commencé avec le même code source que celui que vous aviez téléchargé depuis CodeProject, mais j'ai déplacé la plupart du code dans MainFrame.cs qui lance l'analyse vers une classe Scanner. Afin de vérifier les erreurs d’analyse, j’appelle la méthode suivante au lieu d’appeler directement Twain.Acquire:

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");
        }
    }
}

Je lance généralement l'événement d'analyse sur un thread séparé afin que l'application ne se fige pas pendant l'analyse.

ajoutez simplement ce code sur votre TwainCommand (cmd)

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

ceci apparaîtra si les systèmes ne détectent aucun périphérique ou si l'analyse a été annulée.

Vous pouvez vérifier dans le registre. Dans:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class \ {6bdd1fc6-810f-11d0-bec7-08002be2092f} chaque scanner déjà détecté est énuméré dans les sous-clés.

À partir de 0000 , parcourez et vérifiez si la valeur CreateFileName est vide ou contient des données.

S'il contient des données, il s'agit d'un scanner connecté, s'il est vide, il n'est pas connecté.

J'essaie de faire cela, mais je ne travaille pas bien avec TWAIN Mybe, essayez WIA

mybe essayez ceci:

sur le scanner d’exécution

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}

sur le tick de la minuterie d'événement

{
EndingScan();
tw.CloseSrc();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top