Замена звуковой схемы Windows

  • Автор темы EuGenius
  • Дата начала
E

EuGenius

Гость
#1
Как поменять звуковую схему Windows на
беззвучную("Нет звуков") на время работы программы (или блокировать звуки)?
Помогите, кто знает как реализовать.
Дайте ссылки на подобные статьи.
Благодарю за помощь. :) ;) :)
 
Z

zubr

Гость
#2
Юзай API-функцию SystemParametersInfo с параметром SPI_SETBEEP
 
E

EuGenius

Гость
#3
Пример есть?
Пробовал так(вроде как отключение бипа):
Код:
SystemParametersInfo(SPI_SETBEEP, false, 0, 0);
А AfxMessageBox() всё равно пищит...
Мне надо перекрыть все звуки Windows, вроде как будто вручную выставить "Нет звуков" в "Звуках и аудиоустройствах" Панели управления. :)
 
Z

zubr

Гость
#4
Ну тогда вот другой вариант:
Код:
void GetVolume(DWORD& volume)
{
HWAVEOUT hWO;
WAVEFORMATEX waveF;

::ZeroMemory(&waveF, sizeof(WAVEFORMATEX));
waveOutOpen(&hWO, WAVE_MAPPER, &waveF, 0, 0, 0);
waveOutGetVolume(hWO, &volume);
waveOutClose(hWO);
};

void SetVolume(DWORD volume)
{
HWAVEOUT hWO;
WAVEFORMATEX waveF;

::ZeroMemory(&waveF, sizeof(WAVEFORMATEX));
waveOutOpen(&hWO, WAVE_MAPPER, &waveF, 0, 0, 0);
waveOutSetVolume(hWO, volume); 
waveOutClose(hWO);
};
С помощью GetVolume(vol) получаем текущую громкость, с помощью SetVolume(0), отключаем звук, с помощью SetVolume(vol) включаем звук, который был до отключения.
В модуль подключаем #include <Mmsystem.h> и в проект подключаем библиотеку Winmm.lib
И да будет тебе счастье :)
 
E

EuGenius

Гость
#5
Спасибо, всё получилось.
Как сделать функции(методы) и переменные доступными в модуле, обьявленные в классе? (C++)
Пришлось обьявлять данные функции и переменную звука глобальными.
Пробовал static, но линкер выдает ошибку
Unresolved external
 
Z

zubr

Гость
#6
Все должно работать в классе. Код в студию.
 
E

EuGenius

Гость
#7
Сделал так (глобально):
Код:
DWORD dwSystemVolume;//текущая громкость системы

//Global functions
void GetVolume(DWORD& volume)//gets System volume
{
HWAVEOUT hWO;
WAVEFORMATEX waveF;

::ZeroMemory(&waveF, sizeof(WAVEFORMATEX));
waveOutOpen(&hWO, WAVE_MAPPER, &waveF, 0, 0, 0);
waveOutGetVolume(hWO, &volume);
waveOutClose(hWO);
};

void SetVolume(DWORD volume)//sets System volume
{
HWAVEOUT hWO;
WAVEFORMATEX waveF;

::ZeroMemory(&waveF, sizeof(WAVEFORMATEX));
waveOutOpen(&hWO, WAVE_MAPPER, &waveF, 0, 0, 0);
waveOutSetVolume(hWO, volume); 
waveOutClose(hWO);
};


Проблема со статиком может быть, если сразу проект делался под VC++6,
а потом под MSVS2003 .NET ?
Обьявление
Код:
class CBellvisualDlg : public CDialog
{
...
public:	
static bool isAboutExisted;
...
};
Использование
Код:
BOOL CBellvisualDlg::OnInitDialog()
{
...
CBellvisualDlg::isAboutExisted = false;
...
}
При линковке ошибка:
Bellvisual error LNK2001: unresolved external symbol "public: static bool CBellvisualDlg::isAboutExisted" (?isAboutExisted@CBellvisualDlg@@2_NA)

Если строку закомментировать
//CBellvisualDlg::isAboutExisted = true;
То ошибки нет.
 
Z

zubr

Гость
#8
В файле реализации (*.cpp) переобъяви статическую переменную:
Код:
bool CBellvisualDlg::isAboutExisted;
......
......

BOOL CBellvisualDlg::OnInitDialog()
{
...
CBellvisualDlg::isAboutExisted = false;
...
}