2012-03-27 65 views
0

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

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

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

那么,有没有什么办法强制刷新的UI,例如,或其他解决方法?

回答

0

是的。如果put_mute不与你的窗口的对话框时,您可以使用互操作和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); 
} 

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

这似乎是最理想的,和文档我能找到的每一位表示您之前的解决方案shouldjustwork 。你可能要考虑contacting Microsoft about this one.

+0

你似乎已经在这里合并C#和C++代码。另外,我不明白'new WindowInteropHelper(this).Handle'表达式是如何解析为WMP窗口句柄的。 – kolufild 2012-04-05 10:27:43

相关问题