スキャナーが接続されているかどうかを確認するにはどうすればよいですか (C#、.NET TWAIN)
質問
の .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 でデバイスを有効にしたときにデバイスのオンライン チェックを実行し、デバイスがオンラインでない場合は、上記と同様にユーザーにエラー ダイアログを表示します。
余談とインポ: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();
}