3

デジタル カメラをコンピュータに接続すると、カメラから画像を取得するために使用できるすべての登録済みプログラムを含むダイアログ ボックスが表示されます。ここで、自分のプログラムをリストに追加して、自分のプログラムの項目をクリックすると、自分のプログラムを使用してデジタル カメラから画像を取得できるようにしたいと考えています。

どうもありがとうございました。

4

2 に答える 2

7

WIA には、プログラムがイベント通知を登録できるようにするインターフェイスを提供するデバイス マネージャー オブジェクトがあります。

デバイス マネージャーへの連絡

インターフェイスを使用IWiaDevMgrして、デバイス マネージャーと対話します。への呼び出しで、そのインターフェイスへのポインターを取得しますCoCreateInstance()

    IWiaDevMgr *pWiaDevMgr;
    HRESULT hr;
    hr = CoCreateInstance(CLSID_WiaDevMgr,
        NULL,
        CLSCTX_LOCAL_SERVER,
        IID_IWiaDevMgr,
        (void*)&pWiaDevMgr);

イベントのプログラムを登録する

次に、イベントが発生したときに実行されるプログラムを登録するのは、次のように簡単です。

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_REGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);

コマンド ライン、名前、説明、およびアイコンはすべてBSTR、COM インターフェイスを通過するためです。とその仲間を使用してそれらを作成するかSysAllocString()、Visual C 拡張機能または ATL によって提供されるクラスを使用してそれらを作成および管理できます。

デバイス マネージャーのリリース

インターフェイスに COM 対応のスマート ポインターを使用していない場合は、 によって取得された参照を解放することを忘れないでくださいCoCreateInstance()

    pWiaDevMgr->Release();

解放しない場合、COM システムあなたを罰する方法を見つけますが、すぐには明らかにならないかもしれません...

登録解除

カジュアル テストでは、イベントの登録に使用される 4 つのパラメーターすべてが正確に渡された場合に、登録済みイベントの削除が機能することが示されています。呼び出しは次のとおりです。

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_UNREGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);

登録されたイベントを一覧表示するための文書化された API がないように見えるため、これは潜在的な煩わしさです。これは、インストーラーがプログラムを登録する場合、アンインストーラーがイベントの登録を解除できるように、使用された引数の記録も保持する必要があることを意味します。

イベント パラメータ

コマンド ラインには、コマンド ラインが解析される前に、発生したイベントのポート名と GUID にそれぞれ置き換えられる文字列%1とを含めることができます。%2

アイコン、名前、および説明は、カメラが接続されているときにユーザーに表示されるリストに表示されます。名前は説明よりも短くする必要があります。

アイコンは、ファイル名とリソース識別子の組み合わせです。適切なデフォルト値は"sti.dll,0"、カメラとスキャナーの一般的なイメージです。独自のアイコンを提供する場合、ほぼ確実に文字列に DLL への完全修飾パスが含まれている必要があります。手足に出て、リソースIDの前の区切り記号として以外のパスのどこかに意図的にコンマを含めると、問題が発生すると思います。

舞台裏

WIA/STI がイベントのリストを格納する実際の場所は文書化されていません。ただし、regedit で少し検索すると、XP SP3 システムでイベント カタログが見つかりました。他の星系でも似たような場所にあると想像する人もいるかもしれません...

レジストリ キーHKLM\SYSTEM\CurrrentControlSet\Control\StillImage\Eventsには、システムが認識している各イベントのサブキーが含まれています。各キーには、そのイベントを識別する GUID を含む GUID という名前の値があります。

たとえば、Device Connected イベント ハンドラーはConnectサブキーに一覧表示されます。

個々の WIA/STI デバイスのキーは、HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}キー内の他の場所にあります。

これらの場所は文書化されていないことに注意してください。あなた自身の責任でそれらに触れてください、あなたの走行距離は異なります...

于 2009-06-27T00:57:16.263 に答える
0

WIA (Windows Image Acquisition) インターフェイスを使用する必要があります。IWiaDevMgr には、これを行うための 3 つのメソッド、RegisterEventCallbackProgram、RegisterEventCallbackCLSID、および RegisterEventCallbackInterface が用意されています。ユーザーが [自動再生] ダイアログでクリックしたときに Windows がプログラムを開始するようにするには、RegisterEventCallbackProgram または RegisterEventCallbackCLSID を使用できます。

于 2009-01-21T11:54:43.247 に答える