2008-09-19 45 views
8

Tôi đang sử dụng mã NET TWAIN từ http://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xx trong đơn đăng ký của mình. Khi tôi cố gắng quét hình ảnh khi máy quét không được cắm vào, ứng dụng sẽ bị treo.Làm cách nào để kiểm tra xem máy quét đã được cắm chưa (C#, .NET TWAIN)

Làm cách nào để kiểm tra xem thiết bị đã được cắm chưa, sử dụng trình điều khiển TWAIN?

Trả lời

12

Có lẽ tôi đang đặt câu hỏi quá theo nghĩa đen, nhưng sử dụng API TWAIN, không thể kiểm tra xem thiết bị đã được cắm vào, tức là đã kết nối và bật nguồn chưa. Tiêu chuẩn TWAIN xác định một khả năng cho mục đích này được gọi là CAP_DEVICEONLINE, nhưng tính năng này rất ít được hình thành và do đó rất ít trình điều khiển thực hiện nó một cách chính xác mà nó là vô dụng trong thực tế.

Gần nhất bạn có thể nhận được là: Mở thiết bị (MSG_OPENDS): Hầu như tất cả các trình điều khiển sẽ kiểm tra thiết bị sẵn sàng khi chúng được mở và sẽ hiển thị hộp thoại báo lỗi cho người dùng. Không có cơ chế TWAIN để chặn hoặc phát hiện hộp thoại này Một số trình điều khiển sẽ cho phép người dùng khắc phục sự cố và tiếp tục, trong trường hợp đó (ứng dụng của bạn) sẽ không bao giờ biết có sự cố. Một số trình điều khiển sẽ cho phép người dùng hủy, trong trường hợp đó hoạt động MSG_OPENDS sẽ không thành công, có thể là TWRC_CANCEL nhưng có thể TWRC_FAILURE

Một vài trình điều khiển TWAIN sẽ mở mà không có lỗi ngay cả khi thiết bị không trực tuyến. Trình điều khiển như vậy có thể trả về FALSE thành truy vấn CAP_DEVICEONLINE. Một trình điều khiển như vậy có thể sẽ thực hiện kiểm tra thiết bị trực tuyến khi bạn bật thiết bị với MSG_ENABLEDS, và sau đó nếu thiết bị không trực tuyến, bạn sẽ nhận được hộp thoại báo lỗi cho người dùng và cứ như trên.

Ngoài và IMPO: WIA 'hiện đại hơn' nhưng cũng ít toàn diện hơn để quét hơn TWAIN và trong kinh nghiệm của tôi không thể sử dụng để quét nhiều trang từ bộ nạp tài liệu. Các nhà thiết kế và nhà bảo trì của WIA dường như không hiểu hoặc quan tâm đến các máy quét không phải là flatbeds tiêu dùng thấp. Nó tốt cho máy ảnh.

+0

+1 để giải thích nội dung –

2

Tôi bắt đầu với cùng một mã nguồn mà bạn đã tải xuống từ CodeProject, nhưng đã di chuyển hầu hết mã trong MainFrame.cs để bắt đầu quá trình quét vào lớp Máy quét. Để kiểm tra lỗi quét tôi gọi là phương pháp sau đây thay vì gọi Twain.Acquire trực tiếp:

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

Tôi thường bắt đầu sự kiện quét trên một sợi riêng biệt để các ứng dụng không cần đóng băng trong khi đang quét là trong phát triển.

1

chỉ cần thêm đoạn mã này vào TwainCommand của bạn (cmd)

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

này sẽ xuất hiện nếu các hệ thống phát hiện không có thiết bị hoặc quá trình quét đã bị hủy.

-2

tôi cố gắng làm điều này nhưng không làm việc tốt với TWAIN mybe thử WIA

mybe thử điều này:

vào buton chạy máy quét

timer1.Interval = 30000; 

switch (cmd) 
{ 
case TwainCommand.TransferReady: 

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

default: 

{ 
timer1.Start(); 
break; 
} 

về sự kiện timer tick

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

Điều này trông giống như đoán hơn là câu trả lời. Và một dự đoán không chính xác về điều đó. –

1

Bạn có thể kiểm tra trong sổ đăng ký.In:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f} mỗi máy quét từng được phát hiện được liệt kê ở đó trong các khóa con.

Bắt đầu với 0000, đi qua và kiểm tra xem giá trị CreateFileName trống hay có dữ liệu.

Nếu có dữ liệu, đó là máy quét được kết nối, nếu nó trống, nó không được kết nối.

+0

Thật không may, một số máy quét báo cáo một tên TWAIN nhưng xuất hiện dưới một tên khác trong sổ đăng ký. Điều này lừa đôi khi làm việc. – piedar

Các vấn đề liên quan