2012-03-27 2 views
0

Windows Media Playerを制御するのにWMP SDKを使用しています。最初に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が更新され、ミュート状態が正しく表示されます。私がそれをクリックすると、ミュート解除され、ミュートされていないステートが表示されます(これは正しいステートになります)。

したがって、強制的にUIを強制的に更新する方法はありますか、またはその他の回避策ですか?

答えて

0

はい。put_muteがウィンドウダイアログで機能しない場合は、前述のようにInteropとWM_APPCOMMANDを使用できます。in this related question.特に、APPCOMMAND_VOLUME_MUTEを使用します。 2つのコードスニペットをマージ

、我々が得る:

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

関連する問題