枚举媒体项
[与此页面关联的功能(Windows 媒体播放器 SDK)是旧版功能。 它已被 MediaPlayer 取代。 MediaPlayer 已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer 而不是 Windows 媒体播放器 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
以下代码显示单个播放列表中包含的媒体项。 当用户单击由 IDC_PLVIEW 标识的 ListView 控件中的播放列表时,将运行此代码。
STDMETHODIMP CSyncSettings::ShowMedia(long lIndex)
{
ATLASSERT(m_pMainDlg != NULL);
ATLASSERT(m_spPlaylist.p);
HRESULT hr = S_OK;
long lCount = 0; // Count of items in the playlist.
LVITEM lvI;
ZeroMemory(&lvI, sizeof(LVITEM));
lvI.mask = LVIF_TEXT;
CComPtr<IWMPMedia> spPlaylist; // Playlist the user selected.
CComBSTR bstrSourceURL; // The URL of a digital media file.
CComPtr<IWMPPlaylist> spNewPlaylist; // Temporary playlist that contains media items.
ULONG ulOnDevice = 0;
ULONG ulDidNotFit = 0;
HCURSOR hCursor = LoadCursor(NULL, IDC_WAIT);
HCURSOR hCursorOld = SetCursor(hCursor);
ListView_DeleteAllItems(m_hMediaView);
// Retrieve the playlist the user selected.
hr = m_spPlaylist->get_item(lIndex, &spPlaylist);
if(SUCCEEDED(hr) && spPlaylist)
{
// Retrieve the source URL (the path).
hr = spPlaylist->get_sourceURL(&bstrSourceURL);
}
if(SUCCEEDED(hr) && bstrSourceURL.Length())
{
CComPtr<IWMPCore3> spCore3;
m_spPlayer.QueryInterface(&spCore3);
// Create a temporary IWMPPlaylist object from the IWMPMedia
// playlist object.
hr = spCore3->newPlaylist(CComBSTR("Temp"), bstrSourceURL, &spNewPlaylist);
}
if(SUCCEEDED(hr) && spNewPlaylist)
{
hr = spNewPlaylist->get_count(&lCount);
}
// Walk the playlist.
if(SUCCEEDED(hr) && lCount > 0)
{
for(long i = 0; i < lCount; i++)
{
CComPtr<IWMPMedia> spMedia;
CComBSTR bstrMediaName;
CComBSTR bstrOnDevice = "???";
CComBSTR bstrFit = "???";
hr = spNewPlaylist->get_item(i, &spMedia);
if(SUCCEEDED(hr) && spMedia)
{
// Get the name.
hr = spMedia->get_name(&bstrMediaName);
}
if(SUCCEEDED(hr) && bstrMediaName.Length())
{
// Show the media name.
lvI.iItem = ListView_GetItemCount(m_hMediaView);
lvI.iSubItem = 0;
lvI.pszText = COLE2T(bstrMediaName);
ListView_InsertItem(m_hMediaView, &lvI);
// Retrieve the synchronization state information for
// the digital media file.
hr = GetPartnershipSyncState(spMedia, m_lCurrentPSIndex, &ulOnDevice, &ulDidNotFit);
}
if(SUCCEEDED(hr))
{
// Test whether the media is on the device.
if(ulOnDevice == 1)
{
bstrOnDevice = "Yes";
bstrFit = "Yes";
}
else
{
bstrOnDevice = "No";
// 1 means media did not fit,
// 0 means other reason for failure.
bstrFit = ulDidNotFit ? "No" : "Yes";
}
}
ListView_SetItemText(m_hMediaView, lvI.iItem, 1, COLE2T(bstrOnDevice));
ListView_SetItemText(m_hMediaView, lvI.iItem, 2, COLE2T(bstrFit));
}
}
if(SUCCEEDED(hr) && lCount == 0)
{
// Empty playlist.
lvI.iItem = ListView_GetItemCount(m_hMediaView);
lvI.iSubItem = 0;
lvI.pszText = COLE2T(CComBSTR("No items to display."));
ListView_InsertItem(m_hMediaView, &lvI);
}
SetCursor(hCursorOld);
return hr;
}
有关 GetPartnershipSyncState 函数的实现,请参阅 确定播放列表同步状态。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈