2012-03-27 68 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

相關問題