2011-03-25 7 views
14

스캐너 장치의 원격 제어를위한 .Net 4.0 응용 프로그램을 빌드 중입니다. 나는 TWAIN과 WIA 라이브러리를 모두 시험해 보았지만 같은 문제가있다. 이미지 스캔 스캐너 선택스캔 설정 대화 상자 제외. C#에서 대화 상자가없는 스캐너 사용

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

I 실제로 구성 (스캔 방식의 입력 파라미터)에서 장치를 선택하도록 관리하고 후에 얻어진 화상 검색 주사.

그러나 옵션 스캔 대화 상자의 문제 (DEVICENAME을 사용하여 스캔). 원격 제어 응용 프로그램이므로 대화 상자가 사용자에게 표시되지 않으므로 기본 설정을 사용하여 건너 뛰거나 필요한 경우 구성의 설정을 사용해야합니다.

검색 옵션 대화 상자 : scanning options dialog

+1

UI가 나타나지 않도록하려면 'GetItemsFromUI'를 호출하는 것이 문제의 근원 일 수 있다고 생각하십니까? –

+0

그런데이 문제가 해결되면 _Microsoft Windows Image Acquisition 1.01 Type Library_하지만 다른 라이브러리도 환영합니다. –

+0

@Damien_The_Unbeliever : LOL, 그게 문제가되어야하지만, 대안은 ... –

답변

21

결국 나는 스캐닝 대화 상자에 대한 질문에 작성된 코드를 사용하지 않았다. Scanning with Windows Image Acquisition 2.0 라이브러리의 유용한 예제를 발견하고이를 필자의 필요에 맞게 수정했습니다. 대화 상자없이 스캔.

나는 Using a scanner without dialogs in .Net에 대한 기사를 C#으로 작성된 예제 응용 프로그램과 함께 썼다.

+0

솔루션을 제공해 주셔서 감사합니다. 그것은 작동합니다! :) – HotTester

+0

음, 기사 및 샘플 사용은 훌륭하고 많은 도움이되었습니다. –

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

구현 한 코드를 볼 수 있습니다.

5

먼저 위의 솔루션에 대한 Miljenko Barbir 덕분에 큰 효과를 거두었습니다.

난 당신이 제로 대화 상자를 원한다면, 당신이 기본적으로뿐만 아니라 진행 표시 줄을 제거 (Milijenko의 데모 코드에서) 대신

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

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

를 사용할 수있는 추가하고 싶습니다, 그래서 대화 상자없이 스캐닝을 할 수 있습니다.

+0

이것은 UI없이 코드를 수정하기 위해 http://adfwia.codeplex.com/의 코드를 수정하는 데 정말로 도움이되었습니다. 고마워. –

+0

@Greg, 대단히 감사합니다. 내 시간을 절약 했어. – SaddamBinSyed