Procedure Beep(nFreq, nDura: Word);//nFreq:频率、nDura:持续时间(单位:毫秒) var VerInfo: TOSVersionInfo; nStart: DWord; begin VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo); GetVersionEx(VerInfo);//获取平台和操作系统相关的版本信息 if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then//如果是NT内核(WinNT、Win2000、WinXP、Win2003) Windows.Beep(nFreq, nDura)//直接调用API Beep else//其它操作系统(Win3.X、Win9X、WinMe) begin //通过嵌入ASM实现 asm PUSH BX IN AL, $61 MOV AL, AL AND AL, 3 JNE @@Skip MOV AL, BL OR AL, 3 OUT $61, AL MOV AL, $B6 OUT $43, AL @@Skip: MOV AX, nFreq OUT $42, AL MOV AL, AH OUT $42, AL POP BX end; nStart := GetTickCount; repeat Application.ProcessMessages; Until GetTickCount > nStart + nDura; asm IN AL, $61 AND AL, $FC OUT $61, AL end; end; end;
var
VerInfo: TOSVersionInfo;
nStart: DWord;
begin
VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
GetVersionEx(VerInfo);//获取平台和操作系统相关的版本信息
if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then//如果是NT内核(WinNT、Win2000、WinXP、Win2003)
Windows.Beep(nFreq, nDura)//直接调用API Beep
else//其它操作系统(Win3.X、Win9X、WinMe)
begin
//通过嵌入ASM实现
asm
PUSH BX
IN AL, $61
MOV AL, AL
AND AL, 3
JNE @@Skip
MOV AL, BL
OR AL, 3
OUT $61, AL
MOV AL, $B6
OUT $43, AL
@@Skip:
MOV AX, nFreq
OUT $42, AL
MOV AL, AH
OUT $42, AL
POP BX
end;
nStart := GetTickCount;
repeat
Application.ProcessMessages;
Until GetTickCount > nStart + nDura;
asm
IN AL, $61
AND AL, $FC
OUT $61, AL
end;
end;
end;
windows.beep(587,500); //2
windows.beep(659,500); //3
windows.beep(698,500); // 4
windows.beep(784,500); // 5
windows.beep(880,500); // 6
windows.beep(998,500); // 7
windows.beep(1047,500);
windows.beep(998,500);
windows.beep(880,500);
windows.beep(784,500);
windows.beep(698,500);
windows.beep(659,500);
windows.beep(587,500);
windows.beep(523,500);
如楼上的
不过好象在98下不行
windows.beep(523,500);