Menangani Peristiwa di C++

[Fitur yang terkait dengan halaman ini, Pemutar Media Windows SDK, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer. MediaPlayer telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer alih-alih Pemutar Media Windows SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Anda dapat menerima peristiwa dari Pemutar Media Windows dengan dua cara.

  • Melalui IDispatch dengan menggunakan antarmuka _WMPOCXEvents . Ini adalah antarmuka yang digunakan untuk sebagian besar skenario penyematan.
  • Melalui antarmuka IWMPEvents . Antarmuka ini tersedia ketika kode Anda tersambung ke Pemutar mode penuh, seperti saat remoting kontrol Pemutar Media Windows atau di plug-in UI.

Dalam setiap skenario, Anda mulai mendengarkan peristiwa dengan menggunakan titik koneksi COM.

Contoh kode berikut menggunakan tiga variabel anggota:

CComPtr<IWMPPlayer>         m_spWMPPlayer;
CComPtr<IConnectionPoint>   m_spConnectionPoint;
DWORD                       m_dwAdviseCookie;

Untuk mengambil titik koneksi, Anda terlebih dahulu QueryInterface untuk kontainer titik koneksi.

HRESULT  hr = S_OK;
// Smart pointer to IConnectionPointContainer
CComPtr<IConnectionPointContainer>  spConnectionContainer;

hr = m_spWMPPlayer->QueryInterface(&spConnectionContainer);

Selanjutnya, minta titik koneksi untuk antarmuka peristiwa yang ingin Anda gunakan. Contoh kode berikut pertama kali mencoba menggunakan IWMPEvents. Jika antarmuka tersebut tidak tersedia, antarmuka akan menggunakan _WMPOCXEvents.

// Test whether the control supports the IWMPEvents interface.
if(SUCCEEDED(hr))
{
    hr = spConnectionContainer->FindConnectionPoint(__uuidof(IWMPEvents), &m_spConnectionPoint);
    if (FAILED(hr))
    {
        // If not, try the _WMPOCXEvents interface, which uses IDispatch.
        hr = spConnectionContainer->FindConnectionPoint(__uuidof(_WMPOCXEvents), &m_spConnectionPoint);
    }
}

Terakhir, panggil IConnectionPoint::Sarankan untuk meminta peristiwa.

if(SUCCEEDED(hr))
{
    hr = m_spConnectionPoint->Advise(this, &m_dwAdviseCookie);
}

Dalam contoh sebelumnya, parameter pertama mengasumsikan bahwa kelas panggilan mengimplementasikan IWMPEvents dan _WMPOCXEvents. Parameter kedua adalah nilai pengembalian yang Anda gunakan untuk berhenti mendengarkan peristiwa, seperti ketika program Anda keluar, menggunakan kode yang mirip dengan yang berikut ini:

// Stop listening to events
if (m_spConnectionPoint)
{
    if (0 != m_dwAdviseCookie)
        m_spConnectionPoint->Unadvise(m_dwAdviseCookie);
        m_spConnectionPoint.Release();
}

Menerapkan penanganan aktivitas untuk IWMPEvents dan _WMPOCXEvents berbeda. Untuk IWMPEvents, Anda harus menerapkan fungsi untuk menangani setiap peristiwa yang ditentukan oleh antarmuka, bahkan jika Anda tidak berniat menggunakan peristiwa tersebut.

// IWMPEvents methods
void STDMETHODCALLTYPE OpenStateChange( long NewState ){ return; }
void STDMETHODCALLTYPE PlayStateChange( long NewState ){ return; }
void STDMETHODCALLTYPE AudioLanguageChange( long LangID ){ return; }
// And so on...

Untuk mengimplementasikan handler _WMPOCXEvents , Anda harus menggunakan IDispatch::Invoke, yang merupakan implementasi penanganan aktivitas tunggal untuk semua peristiwa yang terjadi pada antarmuka IDispatch . Ini berarti Bahwa Anda dapat memilih untuk menangani hanya peristiwa tertentu dan mengabaikan orang lain. Contoh kode berikut menunjukkan handler _WMPOCXEvents , menggunakan Invoke, yang hanya menangani peristiwa OpenStateChange dan PlayStateChange :

HRESULT CMyClass::Invoke(
    DISPID  dispIdMember,      
    REFIID  riid,              
    LCID  lcid,                
    WORD  wFlags,              
    DISPPARAMS FAR*  pDispParams,  
    VARIANT FAR*  pVarResult,  
    EXCEPINFO FAR*  pExcepInfo,  
    unsigned int FAR*  puArgErr )
{
    if (!pDispParams)
        return E_POINTER;

    if (pDispParams->cNamedArgs != 0)
        return DISP_E_NONAMEDARGS;

    HRESULT hr = DISP_E_MEMBERNOTFOUND;

    switch (dispIdMember)
    {
        case DISPID_WMPCOREEVENT_OPENSTATECHANGE:
            OpenStateChange(pDispParams->rgvarg[0].lVal /* NewState */ );
            break;

        case DISPID_WMPCOREEVENT_PLAYSTATECHANGE:
            PlayStateChange(pDispParams->rgvarg[0].lVal /* NewState */);
            break;

        // Other cases can handle additional events by using DISPIDs.
    }

    return( hr );
}

Dalam contoh kode sebelumnya, setiap kasus hanya memanggil ke handler IWMPEvents untuk peristiwa yang sesuai. Jika kode Anda hanya menangani _WMPOCXEvents, Anda cukup memanggil fungsi kustom atau menangani peristiwa sebaris setelah pernyataan kasus .

Menerima Peristiwa dari Pemutar Media Windows 10 Mobile

Kontrol Pemutar Media Windows 10 Mobile hanya mendukung penerimaan peristiwa tertentu melalui _WMPOCXEvents dan IWMPEvents. Untuk informasi selengkapnya, silakan lihat dokumentasi untuk IWMPEvents.

Sampel

Paket penyiapan Pemutar Media Windows menginstal sampel yang menunjukkan penanganan peristiwa. Lihat sampel WMPHost untuk informasi selengkapnya.

Sampel

Menggunakan Kontrol Pemutar Media Windows dalam Program C++