스캐너가 연결되어 있는지 확인하는 방법(C#, .NET TWAIN)

StackOverflow https://stackoverflow.com/questions/100284

  •  01-07-2019
  •  | 
  •  

문제

나는 .NET TWAIN 코드를 사용하고 있습니다. http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx 내 응용 프로그램에서.스캐너가 연결되지 않은 상태에서 이미지를 스캔하려고 하면 응용 프로그램이 정지됩니다.

TWAIN 드라이버를 사용하여 장치가 연결되어 있는지 어떻게 확인할 수 있습니까?

도움이 되었습니까?

해결책

질문을 너무 문자 그대로 받아들인 것일 수도 있지만 TWAIN API를 사용하면 장치가 연결되어 있는지 확인할 수 없습니다.연결되어 있고 전원이 켜져 있습니다.TWAIN 표준은 이 목적을 위해 CAP_DEVICEONLINE이라는 기능을 정의하지만 이 기능은 제대로 인식되지 않았고 올바르게 구현하는 드라이버가 거의 없어 실제로는 쓸모가 없습니다.

가장 가까운 것은 다음과 같습니다.장치 열기(MSG_OPENDS):거의 모든 드라이버는 열릴 때 장치 준비 상태를 확인하고 사용자에게 오류 대화 상자를 표시합니다. 이 대화 상자를 억제하거나 감지하는 TWAIN 메커니즘이 없습니다. 일부 드라이버에서는 사용자가 문제를 수정하고 계속 진행할 수 있도록 허용합니다. 이 경우 귀하(귀하의 앱)는 문제가 있는지 전혀 알 수 없습니다.일부 드라이버에서는 사용자가 취소할 수 있도록 허용합니다. 이 경우 MSG_OPENDS 작업이 실패하고 아마도 TWRC_CANCEL을 반환하지만 TWRC_FAILURE를 반환할 수도 있습니다.

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

따로 및 IMPO:WIA는 '더 현대적'이지만 TWAIN보다 스캔에 있어 훨씬 덜 포괄적이며 내 경험상 문서 공급기에서 여러 페이지를 스캔하는 데 사용할 수 없습니다.WIA의 설계자와 유지관리자는 저가형 소비자용 평판형 스캐너 이외의 스캐너에 대해 이해하거나 관심을 두지 않는 것 같습니다.카메라에 좋습니다.

다른 팁

CodeProject에서 다운로드한 것과 동일한 소스 코드로 시작했지만 스캔을 시작하는 MainFrame.cs의 코드 대부분을 Scanner 클래스로 옮겼습니다.스캔 오류를 확인하기 위해 Twain.Acquire를 직접 호출하는 대신 다음 메서드를 호출합니다.

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

나는 일반적으로 스캔이 진행되는 동안 앱이 정지되지 않도록 별도의 스레드에서 스캔 이벤트를 시작합니다.

TwainCommand(cmd)에 이 코드를 추가하세요.

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

이는 시스템이 장치를 감지하지 못하거나 검색이 취소된 경우 나타납니다.

레지스트리에서 확인할 수 있습니다.안에:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} 감지된 각 스캐너는 하위 키에 나열됩니다.

로 시작 0000, 살펴보고 다음과 같은지 확인하세요. CreateFileName 값이 비어 있거나 데이터가 있습니다.

데이터가 있으면 연결된 스캐너이고, 비어 있으면 연결되지 않은 것입니다.

나는 이것을 하려고 노력하지만 TWAIN에서는 잘 작동하지 않습니다. WIA를 시도해보세요

아마 이것을 시도해 보세요:

버튼 실행 스캐너에서

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}

이벤트 타이머 틱에서

{
EndingScan();
tw.CloseSrc();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top