0

我正在使用WMP SDK来控制 Windows Media Player。我首先使用 Windows Media Player 插件向导创建了一个新项目,然后添加了使用命名管道与我的应用程序通信的代码。例如,当我的应用程序需要将音乐静音时,它会向 WMP 插件发送一条消息,然后该插件会将音乐静音:

CComPtr<IWMPSettings> settings;
if (SUCCEEDED(core_->get_settings(&settings)))
{
    settings->put_mute(VARIANT_TRUE);
}

它可以工作,当我发送命令时,它们会被执行,但 UI 不会更新。因此,例如,如果我发送静音命令,音乐会静音(没有声音),但静音按钮仍然显示,好像音乐没有静音。为了证明这一点,我可以在此时更改皮肤或跳到另一首歌曲,UI 得到更新并正确显示静音状态。如果我单击它,它会取消静音,然后再次显示取消静音状态(现在是正确的状态)。

那么,是否有任何方法可以强制刷新 UI,例如,或其他一些解决方法?

4

1 回答 1

0

是的。如果put_mute不能使用您的窗口对话框,您可以使用 Interop 并且WM_APPCOMMAND相关问题中所述。具体来说,您需要使用APPCOMMAND_VOLUME_MUTE.

合并这两个代码片段,我们得到:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;

[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

CComPtr<IWMPSettings> settings;
if (SUCCEEDED(core_->get_settings(&settings)))
{
    SendMessageW(new WindowInteropHelper(this).Handle, WM_APPCOMMAND, new (IntPtr)APPCOMMAND_VOLUME_MUTE);
}

(警告:未经测试的代码。)

这似乎不是最理想的,我能找到的每一点文档都表明您之前的解决方案应该 可以 正常工作。您可能需要考虑就这一问题与 Microsoft 联系。

于 2012-04-05T00:19:57.190 回答