2009-04-02 7 views
0

イメージを操作するActiveXコントロールがMFCにあり、TWAINスキャン機能を追加しようとしています。CDialogがActiveXコントロールのWindowsメッセージを受信しない

イメージがスキャンされたときに私のコントロールに通知するTWAINドライバからWindowsメッセージを受け取れるようにする必要があるため、CDialogを作成して、ドライバのダイアログボックスのHWNDを渡します。

私はネットで見たサンプルコードは、PreTranslateMessageを使用してTWAINからメッセージをキャプチャしますが、ActiveXコントロールではこのメソッドは呼び出されません。

どのように私はそのダイアログのメッセージを得ることができます知っていますか?私はPeekMessageを使っても成功しなかった。

ありがとうございました

+0

PreTranslateMessageは、コントロールまたはダイアログで定義しましたか? –

答えて

1

CDialogを作成する必要はありません。メッセージを処理するためのウィンドウが必要です。 TWAINを扱うものはすべて、独自のスレッドで処理するのが最適です。したがって、CWinThreadまたはAfxBeginThread経由でMFCの新しいスレッドを作成します。そのスレッドでは、CWndを作成します。このCWndのHWNDは、DSMへのすべての呼び出しで渡すものです。各スレッドには独自のメッセージキューがありますので、そこに1つ設定します。あなたが画像を取得されることに合図するメッセージMY_SPECIAL_MESSAGEを投稿すると仮定するなどのPostMessage、SendMessage関数、PostThreadMessageを介してそのスレッドと通信し、あなたのメッセージループは次のようになります。

MSG msg; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (msg.message == MY_SPECIAL_MESSAGE) 
    { 
     GetImageFromTWAIN(); 
    } 
    else if (!ProcessTWAINMessage(&msg)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

は間違いでソースコードを見てこれがどのように詳細に機能するかを見るTWAIN開発キットTWAINは微妙な生き物です。

私を信じて、これは最善のアプローチです。メインスレッドのメッセージキューを使用して、すべて1つのスレッドで実行できますが、回避する必要があります。

+0

こんにちはadzm - これは何年もの間、ハードな方法(同期GetMessageループ)を行ってきましたが、あなたのやり方は実際にはよりよく聞こえます - インタースレッドの同期と通信の頭痛を許してください。 Hmmとマルチスレッドのデバッグ... これを使用しましたか?もしそうなら、どのような環境にさらされているのか尋ねることができますか? – Spike0xff

+0

はい、この正確な方法は現在、数千の医療機関で生産されており、そのうちのいくつかは数百の画像を1日にスキャンします。 – adzm

+0

(数年間使用されています) – adzm

関連する問題