Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Генерация звука через сист. динамик Visual С++

22K
31 марта 2007 года
*Baikal*
13 / / 20.03.2007
Нужно сделать так, чтобы при нажатии на клавишу комп издавал звук через системный динамик. Но это должно происходить во время зажатия клавиши на клавиатуре. Когда клавишу отпускают, то звук выключается.
Понятно, как делать реакцию на нажатие клавиши(через карту сообщений), но как генерировать звук с длительностью, пока нажата клавиша.
"Beep()" не прокатывает, т.к. там нужно указывать длительность звучания.
На ассемблере это проделывал, а в MFC не знаю как.
271
31 марта 2007 года
MrXaK
721 / / 31.12.2002
не помню как си, а в паскале есть функция, которая выдаёт сигнал пока не будет nosound или как-то так, соответственно ставишь между ними sleep и всё... по-моему тот же beep так действует
1.8K
31 марта 2007 года
k3Eahn
365 / / 19.12.2005
*Baikal*
А уже когда-то постил на форуме код для работы с динамиком.
Вот модифицированная версия того кода (для схемы sound-nosound):

Код:
#include <windows.h>

typedef struct _BEEP_SET_PARAMETERS {
    ULONG Frequency;
    ULONG Duration;
} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS;

#define IOCTL_BEEP_SET \
    CTL_CODE(FILE_DEVICE_BEEP, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)

//System dynamic wrapper
struct Beeper
{
    //only single instance allowed
    static Beeper& getInstance()
    {
        static Beeper instance;
        return instance;
    }

    void sound()
    {
        if(isGood() && beepParameters.Frequency != 0)
        {
             DWORD dwReturned;
            DeviceIoControl(hBeep, IOCTL_BEEP_SET, &beepParameters,
                sizeof(BEEP_SET_PARAMETERS),
                NULL, 0, &dwReturned, NULL);
        }
    }

    void noSound()
    {
        if(isGood())
        {
            DWORD dwReturned;

            beepParameters.Frequency = 0;

            DeviceIoControl(hBeep, IOCTL_BEEP_SET, &beepParameters,
                sizeof(BEEP_SET_PARAMETERS),
                NULL, 0, &dwReturned, NULL);
        }
    }

    inline void setFrequency(UINT frequency)
    {
        beepParameters.Frequency = frequency;
    }

    inline bool isGood() const
    {
        return hBeep != INVALID_HANDLE_VALUE;
    }

//only single instance allowed    
private:
   
    Beeper() : hBeep(INVALID_HANDLE_VALUE)
    {
        DefineDosDevice(DDD_RAW_TARGET_PATH, deviceName,
            _T("\\Device\\Beep"));

        hBeep = CreateFile(fileName,
            FILE_GENERIC_READ | FILE_GENERIC_WRITE,
            0, NULL, OPEN_EXISTING, 0, NULL);

        beepParameters.Duration = 0xFFFFFFFF;
        beepParameters.Frequency = 0;
    }

    ~Beeper()
    {
        if(isGood())
            CloseHandle(hBeep);

        DefineDosDevice(DDD_REMOVE_DEFINITION, deviceName, NULL);
    }

    Beeper& operator=(const Beeper&);
    Beeper(const Beeper&);

private:
    static const TCHAR fileName[];
    static const TCHAR *deviceName;
    HANDLE hBeep;
    BEEP_SET_PARAMETERS beepParameters;
};
const TCHAR Beeper::fileName[] =
        _T("\\\\.\\{1127385F-E5BA-4dc6-A0A2-48ECD2F1AB9A}");

const TCHAR *Beeper::deviceName =
        fileName + (sizeof(_T("\\\\.\\"))  - sizeof(TCHAR)) / sizeof(TCHAR);
22K
02 апреля 2007 года
*Baikal*
13 / / 20.03.2007
т.е. создаем обьект этой структуры.
Понятно, что нужно установить частоту.
Когда нажимаем клавишу, то в функции обработки этого сообщения
вызываем функцию Sound и звук включается.
Соответственно при отпускании клавиши пишем noSound и становится тихо.
И больше ничего делать не надо? )
1.8K
02 апреля 2007 года
k3Eahn
365 / / 19.12.2005
Цитата: *Baikal*
т.е. создаем обьект этой структуры.


Он сам создастся. Тебе нужно только получить ссылку на объект, вызвав статический метод getInstance (динамик, вроде один во всей системе, поэтому и объект динамика должен быть одиночкой):

 
Код:
Beeper& beeper = Beeper::getInstance();
22K
03 апреля 2007 года
*Baikal*
13 / / 20.03.2007
to k3Eahn:
Большое спасибо! ))
22K
04 апреля 2007 года
*Baikal*
13 / / 20.03.2007
Попробовал запустить этот код на выполнение.
2 ошибки.
В функции sound и nosound в месте
DeviceIoControl(hBeep, IOCTL_BEEP_SET, &beepParameters,
sizeof(BEEP_SET_PARAMETERS),...
Не нравится второй аргумент...
Косяк, я думаю, связан с этим:
#define IOCTL_BEEP_SET \ CTL_CODE(FILE_DEVICE_BEEP, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)

Что делать?

(k3Eahn, вы писали, что есть предыдущая версия этого кода. Может, тоже выложите сюда. На всякий случай, если исправить не получится.)
1.8K
05 апреля 2007 года
k3Eahn
365 / / 19.12.2005
Что возвращает функция GetLastError?
Проверил этот код под 2k и XP - работает. Под 9x он не будет работать - там нужен другой подход.
22K
05 апреля 2007 года
*Baikal*
13 / / 20.03.2007
Цитата: k3Eahn
Что возвращает функция GetLastError?
Проверил этот код под 2k и XP - работает. Под 9x он не будет работать - там нужен другой подход.



Сейчас точно немогу сказать. Не из дома пишу.
при компиляции выдает указанные выше ошибки
с подписью illegal ... sequence. (там слово одно забыл).
Может, там нужно еще какие-то заголовочные файлы подключить...
(операционка - ХР, Visual C++ 6)

22K
07 апреля 2007 года
*Baikal*
13 / / 20.03.2007
Во всем разобрался, все работает. Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог