2011-03-25 18 views
14

Estoy creando una aplicación .Net 4.0 para el control remoto de un dispositivo de escáner. He probado las bibliotecas TWAIN y WIA, pero tengo el mismo problema. Escaneando imágenes sinselección del escáner y escaneando los cuadros de diálogo de configuración.Uso de un escáner sin cuadros de diálogo en C#

I conocer un artículo útil en WIA scripting in .Net, y modificar a esto:

private Image Scan(string deviceName) 
{ 
    WiaClass wiaManager = null;  // WIA manager COM object 
    CollectionClass wiaDevs = null; // WIA devices collection COM object 
    ItemClass wiaRoot = null;   // WIA root device COM object 
    CollectionClass wiaPics = null; // WIA collection COM object 
    ItemClass wiaItem = null;   // WIA image COM object 

    try 
    { 
     // create COM instance of WIA manager 
     wiaManager = new WiaClass(); 

     // call Wia.Devices to get all devices 
     wiaDevs = wiaManager.Devices as CollectionClass; 
     if ((wiaDevs == null) || (wiaDevs.Count == 0)) 
     { 
      throw new Exception("No WIA devices found!"); 
     } 

     object device = null; 
     foreach (IWiaDeviceInfo currentDevice in wiaManager.Devices) 
     { 
      if (currentDevice.Name == deviceName) 
      { 
       device = currentDevice; 
       break; 
      } 
     } 

     if (device == null) 
     { 
      throw new Exception 
      (
       "Device with name \"" + 
       deviceName + 
       "\" could not be found." 
      ); 
     } 

     // select device 
     wiaRoot = (ItemClass)wiaManager.Create(ref device); 

     // something went wrong 
     if (wiaRoot == null) 
     { 
      throw new Exception 
      (
       "Could not initialize device \"" + 
       deviceName + "\"." 
      ); 
     } 

     wiaPics = wiaRoot.GetItemsFromUI 
     (
      WiaFlag.SingleImage, 
      WiaIntent.ImageTypeColor 
     ) as CollectionClass; 

     if (wiaPics == null || wiaPics.Count == 0) 
     { 
      throw new Exception("Could not scan image."); 
     } 

     Image image = null; 

     // enumerate all the pictures the user selected 
     foreach (object wiaObj in wiaPics) 
     { 
      if (image == null) 
      { 
       wiaItem = (ItemClass)Marshal.CreateWrapperOfType 
       (
        wiaObj, typeof(ItemClass) 
       ); 

       // create temporary file for image 
       string tempFile = Path.GetTempFileName(); 

       // transfer picture to our temporary file 
       wiaItem.Transfer(tempFile, false); 

       // create Image instance from file 
       image = Image.FromFile(tempFile); 
      } 

      // release enumerated COM object 
      Marshal.ReleaseComObject(wiaObj); 
     } 

     if (image == null) 
     { 
      throw new Exception("Error reading scanned image."); 
     } 

     return image; 
    } 
    finally 
    { 
     // release WIA image COM object 
     if (wiaItem != null) 
      Marshal.ReleaseComObject(wiaItem); 

     // release WIA collection COM object 
     if (wiaPics != null) 
      Marshal.ReleaseComObject(wiaPics); 

     // release WIA root device COM object 
     if (wiaRoot != null) 
      Marshal.ReleaseComObject(wiaRoot); 

     // release WIA devices collection COM object 
     if (wiaDevs != null) 
      Marshal.ReleaseComObject(wiaDevs); 

     // release WIA manager COM object 
     if (wiaManager != null) 
      Marshal.ReleaseComObject(wiaManager); 
    } 
} 

Con esta realidad logré para seleccionar el dispositivo a partir de (parámetro de entrada del método Scan) de configuración y recuperar la imagen resultante después de escanear.

Pero el problema con el diálogo de opciones de escaneo (Escanear usando DEVICENAME). Como se trata de una aplicación de control remoto, el diálogo no estará visible para el usuario, por lo que necesito omitirlo utilizando la configuración predeterminada, o usar las configuraciones de una configuración si es necesario. Opciones

Escaneo de diálogo: scanning options dialog

+1

¿Cree que quizás, si está intentando evitar que aparezca una IU, tener una llamada a 'GetItemsFromUI' podría ser la raíz de su problema? –

+0

Por cierto, esto se hace usando _Microsoft Windows Image Acquisition 1.01 Type Library_, pero cualquier otra biblioteca es bienvenida si resuelve este problema. –

+0

@Damien_The_Unbeliever: LOL, ese debe ser el problema, pero ¿cuál es la alternativa? –

Respuesta

21

Al final no utilizó el código escrito en la pregunta para los diálogos de exploración. Encontré un ejemplo útil de la biblioteca Scanning with Windows Image Acquisition 2.0 y lo modifiqué para adaptarlo a mis necesidades. Escaneo sin diálogos

Escribí un artículo sobre Using a scanner without dialogs in .Net con una aplicación de ejemplo escrita en C#.

+0

Gracias por la solución. Funciona ! :) – HotTester

+0

Bueno, el artículo y su uso de muestra es genial y me ayudó mucho. –

0
// show scanner view 
guif.ShowUI = 0; 
guif.ModalUI = 0; 

Puede ver en este código que he implementado.

5

En primer lugar, muchas gracias a Miljenko Barbir por su solución anterior, funciona muy bien.

me gustaría añadir que si quieres cero diálogos, puede utilizar (a partir del código de demostración de Milijenko)

WIA.ImageFile image = item.Transfer(wiaFormatBMP); 

en lugar de

WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false); 

Esto elimina básicamente la barra de progreso, así, para que pueda escanear sin ningún cuadro de diálogo.

+0

Esto realmente me ayudó a modificar el código en http://adfwia.codeplex.com/ para escanear sin ninguna IU. Muchas gracias. –

+0

@Greg, muchas gracias. me salvó el tiempo – SaddamBinSyed

Cuestiones relacionadas