2012-04-11 22 views
2

スキャナから画像をスキャンする必要があるアプリケーションを作成しています。スキャナのプログレスバーのウィンドウが表示されない

私はこのプロジェクト http://www.codeproject.com/Articles/171666/Twain-for-WPF-Applications-Look-Ma-No-Handles 上で自分のアプリケーションをベースとしましたし、走査部はexcelently動作します。

私の問題は次のとおりです。ユーザーにウィンドウを表示せずにスキャンを行う必要があります。

上記のプロジェクトでは、スキャナー設定オプション画面をユーザに表示させないようにするために、 が表示されますが、まだ進行状況バーが表示されます。

プログレスバーが現れ(およびスキャンが始まります)私は

DSixfer(
    appid, 
    srcds, 
    TwDG.Image, 
    TwDAT.ImageNativeXfer, 
    TwMSG.Get, 
    ref hbitmap); 

[DllImport("twain_32.dll", EntryPoint="#1")] 
private static extern TwRC DSixfer([In, Out] TwIdentity origin, [In] TwIdentity dest, TwDG dg, TwDAT dat, TwMSG msg, ref IntPtr hbitmap); 

を呼び出すとき、私は、すべてのパラメータ全体で検索が、プログレスバーを無効にすることができ、そのいずれかを見ることができませんでした。

私は、プログレスバーウィンドウのイベントをキャプチャして非表示にすることを決めましたが、イベントはキャッチされません。

私のアプリケーションはWindowsサービスであり、TWAINはプログレスバーを関連付けるウィンドウハンドルを必要とするため、最初は一時ウィンドウを作成します。

これは私が作成している私のtmpWindowのイベントではなく、プログレスバーを受け取る私のコード

HookProc WindowCreationProcedure = new HookProc(WindowCreationHookProc); 

int hHook = SetWindowsHookEx(WH_SHELL, 
     WindowCreationProcedure, 
     (IntPtr)0, 
     AppDomain.GetCurrentThreadId() 
     ); 

System.Windows.Window tmpWindow = new System.Windows.Window(); 
tmpWindow.WindowState = WindowState.Minimized; //So that the window isn't showed 
tmpWindow.Show(); 

です。私はここで何が欠けていますか?

* EDIT:*は、トウェインの既製の機能が利用可能になったとき、これらすべてのことを行うために、なぜこの記事で

private const int WH_SHELL = 10; 
private const int HSHELL_WINDOWCREATED = 1; 

public static int WindowCreationHookProc(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode == HSHELL_WINDOWCREATED) 
    { 
     Console.WriteLine("WINDOW CREATED"); 
     return 1; 
    } 
    return 0; 
} 
+0

windows vista&upでは、Windowsサービスはデスクトップとのやりとりが禁止されています(これがフックイベントを受信して​​いない可能性があります)。問題を特定するには、まずサービスではないアプリケーションからこれを実行してみてください。その場合、プログレスバーの押下を処理できるサービスからデスクトップアプリケーションを起動することができます。 – user1227804

+0

私が行ったすべてのテストはWindowsフォームアプリケーションからのものです; –

+1

TwainはWindows上ではかなり古くなっています。 WIA(Windows Image Acquisition)に移行する必要があります。 Google離れて。 –

答えて

1

を私のフック関数を追加するために忘れていました。

CAP_INDICATORSの値をfalseに設定するだけです。それだけです。その16進数の値は0x100bです。

0

TWAINのインターフェイスがポップアップしないようにするには、DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSというメッセージをShowUI = FALSEおよびModalUI = FALSEで送信する必要があります。ここにはsome example codeがあります。

スキャン中に増分ステータスを取得することもできますが、スキャン全体をブロックするのではなく、増分ステータスを取得することもできます。 ImageNativeXferを使用する代わりに、Twain Specの4-20ページ以降で説明したメモリブロック転送を使用します。 example code hereが表示されます。

関連する問題