2012-03-27 12 views
0

Ich verwende WMP SDK, um Windows Media Player zu steuern. Ich habe zuerst ein neues Projekt mit dem Windows Media Player Plug-in-Assistenten erstellt und dann Code hinzugefügt, der mit meiner Anwendung über eine Named Pipe kommuniziert. Wenn meine Anwendung Musik muss stumm geschaltet werden, zum Beispiel eine Nachricht an die WMP-Plugin senden und dann stumm schaltet das Plugin die Musik:Windows Media Player-Benutzeroberfläche wird nicht aktualisiert, wenn Befehle mit WMP SDK gesendet werden

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

Es funktioniert, und wenn ich Befehle senden, werden sie ausgeführt, aber die Die Benutzeroberfläche wird nicht aktualisiert. Wenn ich zum Beispiel einen Stummschaltbefehl sende, wird die Musik stummgeschaltet (es gibt keinen Ton), aber die Stummschalttaste wird immer noch so angezeigt, als ob die Musik nicht stummgeschaltet ist. Um dies zu beweisen, kann ich die Skin an dieser Stelle ändern oder zu einem anderen Song springen, und die Benutzeroberfläche wird aktualisiert und zeigt den Stumm-Zustand korrekt an. Wenn ich darauf klicke, wird die Stummschaltung aufgehoben, und dann wird wieder der Status "Unmutiert" angezeigt (der jetzt der korrekte Status ist).

Gibt es also eine Möglichkeit, die Aktualisierung der Benutzeroberfläche zu erzwingen, oder eine andere Problemumgehung?

Antwort

0

Ja. Wenn put_mute nicht mit Ihrem Dialogfeld funktioniert, können Sie Interop und WM_APPCOMMAND wie erwähnt verwenden. Insbesondere möchten Sie APPCOMMAND_VOLUME_MUTE verwenden.

die beiden Code-Snippets Merging, erhalten wir:

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); 
} 

(Achtung:. Ungetesteten Code)

Dies scheint optimal sein, und jedes Bit der Dokumentation die ich finden konnte zeigt Ihre frühere Lösung shouldjustwork . Vielleicht möchten Sie in Betracht ziehen contacting Microsoft about this one.

+0

Sie scheinen C# und C++ - Code hier zusammengeführt zu haben. Außerdem verstehe ich nicht, wie der Ausdruck 'new WindowInteropHelper (this) .Handle' in ein Handle des WMP-Fensters aufgelöst wird. – kolufild