我使用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,例如,或其他一些解决方法?
答案 0 :(得分:0)
是。如果put_mute
无法使用您的窗口对话框,则可以使用Interop和WM_APPCOMMAND
,如上所述in this related question.具体来说,您需要使用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);
}
(警告:未经测试的代码。)
这似乎不是最理想的,我能找到的每一份文档都表明您之前的解决方案should just work。您可能需要考虑contacting Microsoft about this one.