远程处理 Windows Media Player 控件

[与此页面关联的功能(Windows 媒体播放器 SDK)是旧版功能。 它已被 MediaPlayer 取代。 MediaPlayer 已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用 MediaPlayer 而不是 Windows 媒体播放器 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

在 C++ 程序中嵌入 Windows 媒体播放器 控件时,可以将其用作 Player 完整模式的远程扩展。 这称为“远程处理”Windows 媒体播放器控件,它允许你提供全模式 Player 的所有功能,而无需自己实现这些功能。

当你远程控制时,它与 Player 的完整模式共享相同的播放引擎,你的用户可以在嵌入模式 (“停靠”状态) 和完全模式之间来回切换, (“未停靠”状态) 同时数字媒体播放不间断。

启用远程嵌入

若要启用 Windows 媒体播放器 控件的远程嵌入,程序必须实现 IServiceProviderIWMPRemoteMediaServices 接口。 IServiceProvider 是一个标准组件对象模型 (COM) 接口,具有一个名为 QueryService 的单个方法。 Windows 媒体播放器调用此方法以检索指向 IWMPRemoteMediaServices 接口的指针。

IWMPRemoteMediaServices 有多种方法,但其中只有两种方法与远程处理直接相关。 在 GetApplicationName 中,返回程序的名称,Windows 媒体播放器添加到“视图”菜单上的“切换到其他程序”列表。 在 GetServiceType 中,通过返回值“Remote”或“Local”来指示控件的嵌入模式。 如果成功建立远程连接,IWMPPlayer4 接口的 get_isRemote 方法将返回 true。

指定独占在线商店

使用 Windows 媒体播放器 11 时,远程嵌入 Player 控件的应用程序可以指定独占在线商店。 在这种情况下,将禁用 Windows 媒体播放器 中的服务选择器,并且只有指定的在线商店可供用户使用。 有关如何指定独占在线商店的详细信息,请参阅 独占在线商店

停靠和取消停靠

IWMPPlayer4 接口还通过 get_playerApplication 方法提供对 IWMPPlayerApplication 接口的访问权限。 使用 IWMPPlayerApplication 在停靠状态和未停靠状态之间切换,并确定当前停靠状态以及视频或可视化效果显示的位置。

IWMPPlayerApplication::switchToPlayerApplication 方法通过打开Windows 媒体播放器的完整模式并将视频或可视化效果显示传输到“正在播放”窗格来取消停靠控件。 IWMPPlayerApplication::switchToControl 方法通过将视频或可视化效果显示传输到程序并关闭 Player 的完整模式(如果已打开)来停靠控件。 还可以通过从“ 切换到其他 程序”列表中选择某个程序或关闭 Player 的完整模式来停靠控件。 在这两种情况下,播放的任何数字媒体将继续不间断。

传输视频或可视化效果显示

当具有嵌入式远程Windows 媒体播放器控件的多个程序同时运行时,所有控件共享相同的播放引擎。 它们还共享处于未停靠状态的 Player 完整模式的相同实例。 但是,在停靠状态下,只有一个控件可以显示视频或可视化效果。 在未停靠状态下,只有 Player 的完整模式才会显示视频或可视化效果。 switchToControl 方法在停靠和取消停靠状态下工作,并将视频或可视化效果显示传输到调用它的程序。

停靠状态和未停靠状态之间的唯一区别是存在Windows 媒体播放器的完整模式及其对视频或可视化效果显示的所有权。 在未停靠状态下,当前运行的所有嵌入式远程控件仍然可见,并且其用户界面仍完全正常运行。 但是,如果存在视频或可视化效果窗口,则为空。 在停靠状态下,只有一个嵌入式远程控件拥有显示器,但所有用户界面仍可继续工作。

隐藏或更改处于未停靠状态的控件

如果要隐藏或更改处于未停靠状态的嵌入控件的用户界面,或者当程序不拥有显示器时,必须提供自己的实现。 可以在停靠和取消停靠控件时进行这些更改,也可以进行这些更改以响应Windows 媒体播放器事件。 但是,由于可以通过 “切换到其他程序 ”菜单选项停靠 Player,因此通常最好提供此功能来响应事件。

可以为 SwitchedToPlayerApplicationSwitchedToControl 事件实现事件处理程序,也可以为 PlayerDockedStateChange 事件实现单个事件处理程序。 在后一种情况下,可以通过调用 IWMPPlayerApplication::get_playerDocked 来确定停靠状态。 在这两种情况下,都使用 IWMPPlayerApplication::get_hasDisplay 来确定程序是拥有视频还是可视化效果显示。

重新建立远程连接

在某些情况下,远程嵌入式控件与独立 Player 之间的连接将失败,导致指向Windows 媒体播放器接口的指针失效。 Windows 媒体播放器将自动尝试重新连接,并将触发 PlayerReconnect 事件来发出此尝试的信号。 尽管重新连接是自动的,但如果要释放无效指针并检索新指针,以便可以通过新连接访问独立 Player,则必须为此事件提供事件处理程序。

控制未停靠的玩家

无论停靠状态如何,Windows 媒体播放器控件的所有远程实例都可以操作 Player 的完整模式。 但是,在停靠Windows 媒体播放器控件之前,将忽略与 Player 的完整模式无关的功能。 这包括 IWMPPlayer 和派生接口的属性,例如 enabledenableContextMenuuiModewindowlessVideo

错误对话框

从远程Windows 媒体播放器控件实例,设置enableErrorDialogs 属性以特定方式行为。 下列规则适用:

  • 当Windows 媒体播放器取消停靠 (Windows 媒体播放器 UI) 可见时,enableErrorDialogs 属性将被忽略,错误对话框由 Player 处理。
  • 停靠Windows 媒体播放器时,控件的每个远程实例为 enableErrorDialogs 指定的值仅适用于单个控件实例。 也就是说,如果某个特定控件实例为 enableErrorDialogs 指定了值“true”,则当该控件的所有其他实例都指定了值“false”时,只有该实例才会显示一个对话框。

后台远程处理

在控件未使用期间,应避免让 Player 的远程实例在后台运行。 由于远程 Player 控件实例与全模式 Player 共享其播放引擎,因此保持后台实例运行可能会导致意外行为。 例如,在播放文件时,用户可能会关闭完整模式 Player。 用户预期当播放器关闭时,文件播放会完全停止,但音频可能会继续播放,因为播放引擎仍然处于活动状态。

示例

Windows 媒体播放器 SDK 安装包安装演示远程处理的示例。 有关详细信息,请参阅 RemoteSkin 和 WMPML 示例。

示例

在 C++ 程序中使用 Windows 媒体播放器 控件