0

WMPSDKを使用してWindowsMediaPlayerを制御しています。最初にWindowsMediaPlayerプラグインウィザードを使用して新しいプロジェクトを作成し、次に名前付きパイプを使用してアプリケーションと通信するコードを追加しました。たとえば、アプリケーションで音楽をミュートする必要がある場合、WMPプラグインにメッセージを送信してから、プラグインで音楽をミュートします。

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

それは機能し、コマンドを送信すると実行されますが、UIは更新されません。したがって、たとえば、ミュートコマンドを送信すると、音楽はミュートされます(音が出ません)が、ミュートボタンは音楽がミュートされていないかのように表示されます。これを証明するために、この時点でスキンを変更するか、別の曲にスキップすると、UIが更新され、ミュート状態が正しく表示されます。クリックするとミュートが解除され、ミュートされていない状態(現在は正しい状態)が再び表示されます。

たとえば、UIを強制的に更新する方法や、その他の回避策はありますか?

4

1 に答える 1

0

はい。put_muteウィンドウ ダイアログで動作しない場合は、この関連する質問にWM_APPCOMMAND記載されているように Interop を使用できます。具体的には、 を使用します。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);
}

(警告: テストされていないコードです。)

これは次善のようであり、私が見つけることができるすべてのドキュメントは、以前のソリューションがうまくいくはずであることを示してい ますこれについて Microsoft に連絡することを検討してください。

于 2012-04-05T00:19:57.190 に答える