从网上找了一段代码,稍做调整,在win7上调试可以通过:
add备注:由于win7主板修改问题,还是走声卡的。如需要使用,需要自己增加pcie硬件。。。坑啊。。。。
备注:工程属性请选用multi char!
#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 _tmain(int argc, _TCHAR* 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 (int i=0; i<100; i++)
{
param.Duration = 100;
param.Frequency = 2500;
DeviceIoControl(hBeep,
IOCTL_BEEP_SET,
(LPVOID)¶m,
sizeof(BEEP_SET_PARAMETERS),
NULL,
0,
&dwReturn,
NULL);
Sleep(50);
}
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;
}