Как обеспечить HWND для DirectSound SetCooperativeLevel в консольной программе? - PullRequest
5 голосов
/ 16 июля 2011

Я пишу консольную программу, которая использует DirectSound API для визуализации некоторых аудиоданных.Я наткнулся на любопытную проблему, когда следовал Руководство по программированию DirectSound (от Microsoft) .Согласно документации :

После создания объекта устройства необходимо установить уровень сотрудничества для устройства с помощью метода IDirectSound8 :: SetCooperativeLevel .Если вы не сделаете этого, звуки не будут слышны.

Проблема в том, что я пишу консольную программу, а SetCooperativeLevel требует HWND в качестве первого аргумента.У меня нет HWND, чтобы иметь дело с консольной программой.Я попытался указать нулевой указатель, но с ошибкой DSERR_INVALIDPARAM произошел сбой.

Какое значение HWND должно быть указано для IDirectSound8::SetCooperativeLevel в консольной программе?Аудио часть программы планируется построить как общую библиотеку, поэтому она практически ничего не знает о «внешней» программе.

Спасибо за любой совет!

Примечание: я знаю, что есть несколько лучшее решение для простого рендеринга аудио, например использование SDL, OpenAL, SFML (на основе OpenAL), но для моего текущего проекта применяется DirectSound.


Редактировать : Я нашел сообщение от инженера Microsoft, которое устраняет сомнения относительно использования окна рабочего стола или окна консоли в качестве HWND для SetCooperativeLevel при создании буферов GLOBAL_FOCUS.

Ответы [ 2 ]

3 голосов
/ 16 июля 2011

Хотя я сам не проверял это, у вас могут быть некоторые успехи в создании скрытого окна и передаче его HWND методу SetCooperativeLevel.SetCooperativeLevel использует этот hwnd, чтобы определить, когда ваше приложение имеет фокус ввода;поэтому, если вы выбираете кооперативный уровень, где фокус ввода не имеет значения (например, DSSCL_NORMAL), скрытое окно (которое никогда не получит фокус ввода) должно быть в порядке.

2 голосов
/ 23 августа 2012

вы можете использовать это ::GetDesktopWindow().

...