beep函数调用之迷惑
用delphi调用beep函数 使喇叭发生,要达到以下功能:按下某个按键的时候,发出1000hz的声音,当松掉按键的时候声音立刻停止,功能是实现了,不过 当按下按键的时候发出声音是连续的,松掉按键后声音并不是立刻停止 有延时 不知道怎么解决
[解决办法]
建议使用WinIO.DLL直接进行I/O端口读写来实现, WinIO.DLL可从此处下载: http://www.daqchina.net/daqchina/download/winio.zip
unit U_WinIO;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
bWinIOInitialized: Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function InitializeWinIo(): BOOL; stdcall; external 'WinIO.dll ';
procedure ShutdownWinIo(); stdcall; external 'WinIO.dll ';
function GetPortVal(wPortAddr: WORD; var pdwPortVal: DWORD; bSize: BYTE): BOOL; stdcall; external 'WinIO.dll ';
function SetPortVal(wPortAddr: WORD; dwPortVal: DWORD; bSize: BYTE): BOOL; stdcall; external 'WinIO.dll ';
procedure TForm1.FormCreate(Sender: TObject);
begin
bWinIOInitialized := InitializeWinIO();
KeyPreview := True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ShutDownWinIO;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
dwValue : DWORD;
begin
If bWinIOInitialized then
begin
GetPortVal($61, dwValue, 1);
dwValue := dwValue or $03;
SetPortVal($61, dwValue, 1);
end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
dwValue : DWORD;
begin
If bWinIOInitialized then
begin
GetPortVal($61, dwValue, 1);
dwValue := dwValue and $FC;
SetPortVal($61, dwValue, 1);
end;
end;
end.
[解决办法]
先录好1Khz的声音(也可以用软件生成),然后用MediaPlayer来播放, 当然,播放中途你也可以停止它。
[解决办法]
mark
[解决办法]
我觉得还是用SoundPlay API 函数直接播放WAV文件要好些吧?
[解决办法]
程序修改一下, 增加上设置发音频率的代码:
procedure TForm1.FormCreate(Sender: TObject);
const
BeepFreq = 1000; //发音频率1000Hz
var
wFreq : WORD;
begin
bWinIOInitialized := InitializeWinIO();
KeyPreview := True;
//设置发音频率
If bWinIOInitialized then
begin
wFreq := 1193100 div BeepFreq;
SetPortVal($43, $B6, 1);
SetPortVal($42, wFreq mod 256, 1);
SetPortVal($42, wFreq div 256, 1);
end;
end;
程序运行后, 在程序窗体Form1获得焦点时, 按下任意键即可发出指定频率的声音, 释放按键声音即刻停止。