2008-09-19 3 views

답변

12

아마도 글자 그대로 질문을하고 있을지 모르지만 TWAIN API를 사용하면 기기가 연결되어 있는지 (예 : 연결되어 있고 전원이 켜져 있는지) 확인할 수 없습니다. TWAIN 표준은이 목적을 위해 CAP_DEVICEONLINE이라는 기능을 정의하지만이 기능은 너무 저조한 것으로 거의 제대로 구현되지 않으므로 실제로 쓸모가 없습니다.

가장 가까운 장치는 다음과 같습니다. 장치 열기 (MSG_OPENDS) : 거의 모든 드라이버는 장치를 열었을 때 장치가 작동하는지 확인하고 사용자에게 오류 대화 상자를 표시합니다. 이 대화 상자를 표시하거나 숨기기위한 TWAIN 메커니즘이 없습니다. 일부 드라이버는 사용자가 문제를 해결하고 계속할 수 있도록 허용합니다.이 경우 사용자 (귀하의 응용 프로그램)는 문제가 발생하지 않을 것입니다. 일부 드라이버는 사용자가 취소 할 수있는 경우 MSG_OPENDS 작업이 실패하고 아마도 TWRC_CANCEL을 반환하지만 TWRC_FAILURE 일 수 있습니다.

오프라인 상태에서도 일부 TWAIN 드라이버가 오류없이 열립니다. 이러한 드라이버는 일 수 있으며은 CAP_DEVICEONLINE 쿼리에 FALSE를 반환합니다. 이러한 드라이버는 MSG_ENABLEDS를 사용하여 장치를 활성화 할 때 장치 온라인 검사를 수행 한 다음 장치가 온라인 상태가 아닌 경우 위와 같이 사용자에게 오류 대화 상자를 표시하는 등의 작업을 수행합니다.

WIDE는 '현대적'이지만 TWAIN보다 스캔 기능이 훨씬 부족하고 문서 공급 장치에서 여러 페이지를 스캔 할 수 없다는 경험이 있습니다. WIA의 디자이너와 관리자는 저가형 소비자 평판 이외의 스캐너를 이해하거나 신경 쓰지 않는 것처럼 보입니다. 그것은 카메라에 좋습니다.

+0

물건을 설명하기 위해 +1 –

2

CodeProject에서 다운로드 한 것과 동일한 소스 코드로 시작되었지만 MainFrame.cs의 코드 대부분을 검사를 시작하는 Scanner 클래스로 옮겼습니다. 나는 보통 스캔에있는 동안 동결하지 않는 응용 프로그램의 순서를 별도의 스레드에서 스캔 이벤트를 시작

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

을 : 내가 직접 Twain.Acquire를 호출하는 대신에 다음과 같은 메소드를 호출 스캔 오류를 확인하기 위해 진행.

1

은 (cmd를)

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

시스템이 어떤 장치를 검색하거나 스캔이 취소 된 경우이 표시됩니다 TwainCommand에이 코드를 추가합니다.

-2

내가이 작업을 수행하려고하지만, TWAIN 좋은 일을 해달라고은

mybe이 시도 WIA를 시도 mybe : 이벤트 타이머 틱에 부톤 섬 실행 스캐너

timer1.Interval = 30000; 

switch (cmd) 
{ 
case TwainCommand.TransferReady: 

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

default: 

{ 
timer1.Start(); 
break; 
} 

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

이것은 대답보다 추측처럼 보입니다. 그리고 그것에서 잘못된 추측. –

1

레지스트리를 체크인 할 수 있습니다.In :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} 하위 스캐너에는 각 스캐너가 열거되어 있습니다.

0000으로 시작하여 CreateFileName 값이 비어 있거나 데이터가 있는지 확인합니다.

데이터가있는 경우 연결된 스캐너이며 비어있는 경우 연결되어 있지 않습니다.

+0

유감스럽게도 일부 스캐너는 TWAIN에 하나의 이름을보고하지만 레지스트리에 다른 이름으로 표시됩니다. 이 트릭은 가끔씩 작동합니다. – piedar

관련 문제