title: Using a scanner without dialogs in C#
body: <p>I'm building a .Net 4.0 application for remote control of a scanner device. I have tried both TWAIN and WIA libraries, but I have the same problem. Scanning images <strong>without</strong> <em>scanner selection</em> and <em>scanning settings dialogs</em>. </p>
  
  <p>I found a useful article on <a href="http://www.codeproject.com/KB/dotnet/wiascriptingdotnet.aspx" rel="noreferrer">WIA scripting in .Net</a>, and modified it to this:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>
  
  <p>With this I actually managed to select the device from configuration (input parameter of the Scan method) and retrieve the resulting image after scan. </p>
  
  <p>But the problem with scanning options dialog (Scan using DEVICENAME). As this is a remote control application, dialog will not be visible to the user, so I need to either skip it using default settings, or use settings from a configuration if necessary.</p>
  
  <p>Scanning options dialog:
  <img src="https://i.stack.imgur.com/kdDHj.jpg" alt="scanning options dialog"></p>