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

Тема в разделе "MS Visual C++", создана пользователем EuGenius, 28 янв 2007.

  1. EuGenius

    EuGenius Гость

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

    zubr Гость

    Юзай API-функцию SystemParametersInfo с параметром SPI_SETBEEP
     
  3. EuGenius

    EuGenius Гость

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

    zubr Гость

    Ну тогда вот другой вариант:
    Код (Text):
    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
    И да будет тебе счастье :)
     
  5. EuGenius

    EuGenius Гость

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

    zubr Гость

    Все должно работать в классе. Код в студию.
     
  7. EuGenius

    EuGenius Гость

    Сделал так (глобально):
    Код (Text):
    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 ?
    Обьявление
    Код (Text):
    class CBellvisualDlg : public CDialog
    {
    ...
    public:
    static bool isAboutExisted;
    ...
    };
    Использование
    Код (Text):
    BOOL CBellvisualDlg::OnInitDialog()
    {
    ...
    CBellvisualDlg::isAboutExisted = false;
    ...
    }
    При линковке ошибка:
    Bellvisual error LNK2001: unresolved external symbol "public: static bool CBellvisualDlg::isAboutExisted" (?isAboutExisted@CBellvisualDlg@@2_NA)

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

    zubr Гость

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

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

    EuGenius Гость

    Спасибо. Всё нормально. :) :) :)
     
Загрузка...

Поделиться этой страницей