8

アプリケーションでhttp://www.codeproject.com/KB/dotnet/twaindotnet.aspx?msg=1007385#xx1007385xxの .NET TWAIN コードを使用しています。スキャナが接続されていないときに画像をスキャンしようとすると、アプリケーションがフリーズします。

TWAIN ドライバーを使用して、デバイスが接続されているかどうかを確認するにはどうすればよいですか?

4

5 に答える 5

12

質問を文字通りに受け止めすぎているかもしれませんが、TWAIN API を使用すると、デバイスがプラグインされているかどうか、つまり接続されていて電源が入っているかどうかを確認することはできません。TWAIN 標準では、CAP_DEVICEONLINE と呼ばれるこの目的のための機能が定義されていますが、この機能は十分に考えられておらず、正しく実装されているドライバーはほとんどないため、実際には役に立ちません。

デバイスを開く (MSG_OPENDS): ほとんどすべてのドライバーは、デバイスを開くときにデバイスの準備ができているかどうかを確認し、ユーザーにエラー ダイアログを表示します。このダイアログを抑制または検出するための TWAIN メカニズムはありません。一部のドライバーは、ユーザーが問題を修正して続行できるようにします。一部のドライバーではユーザーがキャンセルできます。その場合、MSG_OPENDS 操作は失敗し、おそらく TWRC_CANCEL が返されますが、TWRC_FAILURE が返されることもあります。

デバイスがオフラインであっても、いくつかの TWAIN ドライバーはエラーなしで開きます。このようなドライバー、CAP_DEVICEONLINE のクエリに対して FALSE を返す場合があります。このようなドライバーは、MSG_ENABLEDS を使用してデバイスを有効にすると、おそらくデバイスのオンライン チェックを実行し、デバイスがオンラインでない場合は、ユーザーにエラー ダイアログを表示します。

余談ですが、WIA は「より最新」ですが、スキャンに関しては TWAIN よりもはるかに包括的ではなく、私の経験では、ドキュメント フィーダーからの複数ページのスキャンには使用できません。WIA の設計者と保守担当者は、ローエンドの消費者向けフラットベッド以外のスキャナーを理解していないか、気にしていないようです。カメラにはいいです。

于 2008-10-10T22:12:19.277 に答える
2

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

通常、スキャンの進行中にアプリがフリーズしないように、別のスレッドでスキャン イベントを開始します。

于 2008-10-01T08:23:13.863 に答える
1

このコードを TwainCommand (cmd) に追加するだけです

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

これは、システムがデバイスを検出しない場合、またはスキャンがキャンセルされた場合に表示されます。

于 2009-06-24T03:49:57.823 に答える
-2

私はこれを試してみましたが、TWAINではうまくいきません.WIAを試してみてください.

これを試してみてください:

ボタン実行スキャナーで

timer1.Interval = 30000;

switch (cmd)
{
case TwainCommand.TransferReady:

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

default:

{
timer1.Start();
break;
}

イベント タイマー ティックで

{
EndingScan();
tw.CloseSrc();
}
于 2010-04-24T18:51:55.863 に答える