Пользовательский интерфейс проигрывателя Windows Media не обновляется при отправке команд с помощью WMP SDK

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

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

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

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


person kolufild    schedule 27.03.2012    source источник


Ответы (1)


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

person MrGomez    schedule 05.04.2012
comment
Похоже, вы объединили здесь код C # и C ++. Кроме того, я не понимаю, как выражение new WindowInteropHelper(this).Handle преобразуется в дескриптор окна WMP. - person kolufild; 05.04.2012