Пользовательский интерфейс Windows Media Player не обновляется при отправке команд с WMP SDK - PullRequest
0 голосов
/ 27 марта 2012

Я использую WMP SDK для управления проигрывателем Windows Media.Сначала я создал новый проект с помощью мастера подключаемых модулей проигрывателя Windows Media, а затем добавил код, который взаимодействует с моим приложением с помощью именованного канала.Например, когда мое приложение требует отключения звука, оно отправляет сообщение в плагин WMP, а затем плагин отключает музыку:

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

Это работает, и когда я отправляю команды, они выполняются,но пользовательский интерфейс не обновляется.Так, например, если я посылаю команду отключения звука, музыка отключается (нет звука), но кнопка отключения звука все равно отображается, как будто музыка не отключена.Чтобы доказать это, я могу изменить скин в этот момент или перейти к другой песне, и пользовательский интерфейс обновляется и правильно показывает состояние отключения звука.Если я щелкну по нему, он включит звук, а затем снова отобразит состояние без звука (что сейчас является правильным состоянием).

Итак, есть ли способ, например, принудительно обновить интерфейс или какой-то другой обходной путь?

1 Ответ

0 голосов
/ 05 апреля 2012

Да. Если put_mute не работает с вашим диалоговым окном, вы можете использовать Interop и WM_APPCOMMAND, как указано в этом связанном вопросе. В частности, вы захотите использовать 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);
}

(Предупреждение: непроверенный код.)

Это кажется неоптимальным, и каждая найденная мною документация указывает на ваше предыдущее решение должно просто работать . Возможно, вы захотите связаться с Microsoft по этому поводу.

...