#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);
Генерация звука через сист. динамик Visual С++
Понятно, как делать реакцию на нажатие клавиши(через карту сообщений), но как генерировать звук с длительностью, пока нажата клавиша.
"Beep()" не прокатывает, т.к. там нужно указывать длительность звучания.
На ассемблере это проделывал, а в MFC не знаю как.
не помню как си, а в паскале есть функция, которая выдаёт сигнал пока не будет nosound или как-то так, соответственно ставишь между ними sleep и всё... по-моему тот же beep так действует
А уже когда-то постил на форуме код для работы с динамиком.
Вот модифицированная версия того кода (для схемы sound-nosound):
Код:
Понятно, что нужно установить частоту.
Когда нажимаем клавишу, то в функции обработки этого сообщения
вызываем функцию Sound и звук включается.
Соответственно при отпускании клавиши пишем noSound и становится тихо.
И больше ничего делать не надо? )
Цитата: *Baikal*
т.е. создаем обьект этой структуры.
Он сам создастся. Тебе нужно только получить ссылку на объект, вызвав статический метод getInstance (динамик, вроде один во всей системе, поэтому и объект динамика должен быть одиночкой):
Код:
Beeper& beeper = Beeper::getInstance();
Большое спасибо! ))
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, вы писали, что есть предыдущая версия этого кода. Может, тоже выложите сюда. На всякий случай, если исправить не получится.)
Проверил этот код под 2k и XP - работает. Под 9x он не будет работать - там нужен другой подход.
Цитата: k3Eahn
Что возвращает функция GetLastError?
Проверил этот код под 2k и XP - работает. Под 9x он не будет работать - там нужен другой подход.
Проверил этот код под 2k и XP - работает. Под 9x он не будет работать - там нужен другой подход.
Сейчас точно немогу сказать. Не из дома пишу.
при компиляции выдает указанные выше ошибки
с подписью illegal ... sequence. (там слово одно забыл).
Может, там нужно еще какие-то заголовочные файлы подключить...
(операционка - ХР, Visual C++ 6)
Во всем разобрался, все работает. Спасибо!