2008-09-19 55 views

Respuesta

12

Tal vez estoy tomando la pregunta demasiado literalmente, pero utilizando la API TWAIN, no es posible verificar si un dispositivo está enchufado, es decir, conectado y encendido. El estándar TWAIN define una capacidad para este propósito llamada CAP_DEVICEONLINE, pero esta característica está tan mal concebida y tan pocos controladores la implementan correctamente que es inútil en la práctica.

Lo más cerca que puede obtener es esto: Abra el dispositivo (MSG_OPENDS): Casi todos los controladores verifican si el dispositivo está listo cuando se abren y muestran un cuadro de diálogo de error al usuario. No existe un mecanismo TWAIN para suprimir o detectar este cuadro de diálogo Algunos controladores permitirán al usuario corregir el problema y continuar, en cuyo caso usted (su aplicación) nunca sabrá que hubo un problema. Algunos controladores permitirán que el usuario cancele, en cuyo caso la operación MSG_OPENDS fallará, probablemente devuelva TWRC_CANCEL pero quizás TWRC_FAILURE

Algunos controladores TWAIN se abrirán sin error aunque el dispositivo esté fuera de línea. Tal controlador puede devolver FALSE a una consulta de CAP_DEVICEONLINE. Es probable que ese controlador realice la verificación en línea del dispositivo cuando habilita el dispositivo con MSG_ENABLEDS, y luego, si el dispositivo no está en línea, obtiene el diálogo de error para el usuario, y así sucesivamente.

Aside e IMPO: WIA es "más moderno" pero también mucho menos completo para el escaneo que TWAIN, y en mi experiencia inutilizable para el escaneo de múltiples páginas desde un alimentador de documentos. Los diseñadores y mantenedores de WIA parecen no entender o preocuparse por los escáneres que no sean de gama baja para consumidores de gama baja. Es bueno para las cámaras.

+0

+1 para explicar las cosas –

2

Comencé con el mismo código fuente que descargó de CodeProject, pero moví la mayor parte del código en MainFrame.cs que inicia el escaneo a una clase de escáner. Con el fin de comprobar los errores de exploración que llamo el método siguiente en lugar de llamar Twain.Acquire directamente:

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

I suelen iniciar el evento de análisis en un hilo separado a fin de que la aplicación no congelar durante la exploración está en Progreso.

1

sólo tiene que añadir este código en su TwainCommand (cmd)

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

este aparecerá si los sistemas no detecta ningún dispositivo o el escaneo ha sido cancelada.

-2

lo intento hacer esto, pero no funcionan bien con TWAIN mybe tratar WIA

mybe intente esto:

en el escáner buton plazo

timer1.Interval = 30000; 

switch (cmd) 
{ 
case TwainCommand.TransferReady: 

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

default: 

{ 
timer1.Start(); 
break; 
} 

el paso del temporizador de eventos

{ 
EndingScan(); 
tw.CloseSrc(); 
} 
+1

Esto parece más una conjetura que una respuesta. Y una suposición incorrecta de eso. –

1

Puede verificar en el registro.En:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} cada escáner que alguna vez se haya detectado se enumera allí en las subclaves.

Comenzando con 0000, revise si el valor CreateFileName está en blanco o tiene datos.

Si tiene datos, es un escáner conectado, si está en blanco, no está conectado.

+0

Desafortunadamente, algunos escáneres informan un nombre a TWAIN pero aparecen con un nombre diferente en el registro. Sin embargo, este truco sí funciona a veces. – piedar

Cuestiones relacionadas