次の方法で共有


C++ でのビデオ コントロール イベントの受け取り

このトピックは Windows XP にのみ適用。

TV アプリケーションでは、ビデオ コントロールを含むさまざまなオブジェクトがイベントを送信する。アプリケーションはイベントを受け取り、それに応答することができる。たとえば、ビデオ コントロールはビデオ ウィンドウがクリックされたとき、またはキーストロークを受け取ったときにイベントを送信する。

オブジェクトは COM 接続ポイントを使ってイベントを送信する。イベントを捕捉するためにクライアントはイベント インターフェイスを実装する。オブジェクトはそのインターフェイスのメソッドを呼び出してイベントを起動する。たとえば、ビデオ コントロールは _IMSVidCtlEvents インターフェイスを介してイベントを送信する。マウス クリック イベントは _IMSVidCtlEvents::Click である。

_IMSVidCtlEvents 接続ポイント

COM の用語では、イベント インターフェイスは送信インターフェイスであり、イベントを送信するオブジェクトはソース、イベントを受け取るオブジェクトはシンクである。通常、送信インターフェイスはディスプインターフェイスであるため、シンクは IDispatch を実装する必要がある。ソースは IDispatch::Invoke にメソッドのディスパッチ識別子 (dispid) を指定して呼び出し、イベントを起動する。

イベントを受け取るには :

  • 送信インターフェイスを実装する。
  • IConnectionPointContainer::FindConnectionPoint メソッドを呼び出してビデオ コントロールから接続ポイントを取得する。送信インターフェイスのインターフェイス ID (IID) を渡す。FindConnectionPoint メソッドは IConnectionPoint インターフェイスへのポインタを返す。
  • IConnectionPoint::Advise メソッドを呼び出して接続を確立する。

次のコードでは、クライアントとビデオ コントロールの間に接続ポイントを設定している。

HRESULT hr;
DWORD dwCookie;
CComPtr<IMSVidCtl> m_pVideoControl; // ビデオ コントロールへのポインタ。

// ビデオ コントロールの IConnectionPointContainer を問い合わせる。
CComQIPtr<IConnectionPointContainer> pContainer(m_pVideoControl);
if (pContainer)  
{
    // 接続ポイントを見つける
    CComPtr<IConnectionPoint> pConnectPt;
    hr = pContainer->FindConnectionPoint(DIID__IMSVidCtlEvents, 
            &pConnectPt);
    if (SUCCEEDED(hr))
    {
        // イベント シンクの IUnknown ポインタを取得する。通常、
        // イベント シンクはクライアント自身である。
        CComQIPtr<IUknown> pUnk;
        this->QueryInterface(IID_IUnknown, (void**)&pUnk);
        hr = pConnectPt->Advise(pUnk, &dwCookie);
    }
}

Advise メソッドは接続を識別するトークン (cookie とも呼ばれる) を返す。シンクが接続を解除するまで、ソース オブジェクトは 5つのイベントを送信する。接続を解除するには、IConnectionPoint::Unadvise メソッドを呼び出して同じトークンを渡す。

hr = pConnectPt->Unadvise(dwCookie);