Cool Beep!
NoBug 2000-03-09 04:08:00 我想计算机中的扬声器已经快被我们遗忘了吧?不过,今天我写了一个关于控制NT下的扬声器的示例程序,虽然很短,但很有趣,大家有空过来看看!
// Beep.cpp : Defines the entry point for the console application.
// Author : NoBug
// Data : 00.3.9
// This program will run only on NT
#include <Windows.h>
#include <Winioctl.h>
#include <Stdio.h>
#define DeviceName "\\Device\\Beep"
#define SymbolicName "DosBeep"
// copy from NT DDK
#define IOCTL_BEEP_SET CTL_CODE(FILE_DEVICE_BEEP, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define BEEP_FREQUENCY_MINIMUM 0x25
#define BEEP_FREQUENCY_MAXIMUM 0x7FFF
typedef struct _BEEP_SET_PARAMETERS {
ULONG Frequency;
ULONG Duration;
} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS;
int main(int argc, char* argv[])
{
BOOL bReturn;
HANDLE hBeep;
CHAR szFileName[MAX_PATH];
int iIndex;
DWORD dwReturn;
OSVERSIONINFO ver;
BEEP_SET_PARAMETERS param;
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&ver);
if(ver.dwPlatformId!=VER_PLATFORM_WIN32_NT)
{
MessageBox(NULL,"This program must run on NT!","",MB_OK);
return 0;
}
// Create a symbolic object to beep device
// so I can access this device in user mode.
bReturn = DefineDosDevice(DDD_RAW_TARGET_PATH, SymbolicName, DeviceName);
if(bReturn==FALSE)
{
MessageBox(NULL,"DefineDosDevice Error!","",MB_OK);
return 0;
}
sprintf(szFileName,"\\\\.\\%s",SymbolicName);
hBeep = CreateFile(szFileName,
0,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hBeep==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"CreateFile Error!","",MB_OK);
return 0;
}
for(iIndex=1;iIndex<50;iIndex++)
{
param.Duration = 100;
param.Frequency = 2000 + iIndex*50;
// send device io control IRP to beep device
DeviceIoControl(hBeep,
IOCTL_BEEP_SET,
(LPVOID)¶m,
sizeof(BEEP_SET_PARAMETERS),
NULL,
0,
&dwReturn,
NULL);
// sleep
Sleep(param.Duration);
}
CloseHandle(hBeep);
// remove the symbolic object
DefineDosDevice(DDD_REMOVE_DEFINITION,
SymbolicName,
DeviceName);
return 0;
}