2011-03-25 5 views
14

में संवाद किए बिना स्कैनर का उपयोग करना मैं स्कैनर डिवाइस के रिमोट कंट्रोल के लिए .NET 4.0 एप्लिकेशन बना रहा हूं। मैंने TWAIN और WIA पुस्तकालयों दोनों की कोशिश की है, लेकिन मुझे एक ही समस्या है। स्कैनिंग छवियों स्कैनर चयन और स्कैनिंग सेटिंग्स संवादसी #

मैं WIA scripting in .Net पर एक उपयोगी लेख पाया, और यह करने के लिए इसे संशोधित:

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); 
    } 
} 
इस के साथ

मैं वास्तव में विन्यास (स्कैन विधि के इनपुट पैरामीटर) से डिवाइस चुनें करने में कामयाब रहे और बाद जिसके परिणामस्वरूप छवि को पुनः प्राप्त स्कैन।

लेकिन स्कैनिंग विकल्प संवाद (DEVICENAME का उपयोग करके स्कैन) के साथ समस्या। चूंकि यह एक रिमोट कंट्रोल एप्लिकेशन है, तो उपयोगकर्ता को उपयोगकर्ता दिखाई नहीं देगा, इसलिए मुझे इसे डिफ़ॉल्ट सेटिंग्स का उपयोग करके छोड़ना होगा, या यदि आवश्यक हो तो कॉन्फ़िगरेशन से सेटिंग्स का उपयोग करना होगा।

स्कैनिंग विकल्प संवाद: scanning options dialog

+1

क्या आपको लगता है कि अगर आप किसी यूआई को आने से बचने की कोशिश कर रहे हैं, तो 'GetItemsFromUI' पर कॉल करने से आपकी समस्या की जड़ हो सकती है? –

+0

जिस तरह से यह _Microsoft विंडोज छवि अधिग्रहण का उपयोग कर किया जाता है 1.01 टाइप लाइब्रेरी_ लेकिन अगर यह समस्या हल करती है तो कोई अन्य लाइब्रेरी स्वागत है। –

+0

@Damien_The_Unbeliever: एलओएल, यह समस्या होनी चाहिए, लेकिन वैकल्पिक क्या है ... –

उत्तर

21

अंत में मैं स्कैनिंग संवाद के लिए प्रश्न में लिखे कोड का उपयोग नहीं किया। मुझे Scanning with Windows Image Acquisition 2.0 लाइब्रेरी का एक उपयोगी उदाहरण मिला और मेरी आवश्यकताओं से मेल खाने के लिए इसे संशोधित किया। बिना किसी संवाद के स्कैनिंग।

मैंने Using a scanner without dialogs in .Net के बारे में एक लेख लिखा जिसमें सी # में लिखा गया एक उदाहरण अनुप्रयोग है।

+0

धन्यवाद। यह काम करता हैं ! :) – HotTester

+0

अच्छा, लेख और इसका नमूना उपयोग बहुत अच्छा है और मुझे बहुत मदद मिली। –

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

आप इस कोड में देख सकते हैं जो मैंने लागू किया है।

5

सबसे पहले, मिल्जेन्को बारबिर को उनके उपरोक्त समाधान के लिए बहुत धन्यवाद, यह बहुत अच्छा काम करता है।

मैं जोड़ने के लिए है कि यदि आप शून्य संवाद चाहते हैं, आप (Milijenko के डेमो कोड से) का उपयोग कर सकते

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

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

के बजाय

यह मूलतः प्रगति बार के रूप में अच्छी तरह से निकाल देता है चाहते हैं, तो आप बिना किसी संवाद के स्कैनिंग प्राप्त करते हैं।

+0

यह वास्तव में मुझे किसी भी यूआई के बिना स्कैन करने के लिए http://adfwia.codeplex.com/ पर कोड को संशोधित करने में मदद करता है। बहुत बहुत धन्यवाद। –

+0

@ ग्रेग, बहुत बहुत धन्यवाद। यह मेरा समय बचाया – SaddamBinSyed