首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

beep函数调用之迷惑解决思路

2012-02-28 
beep函数调用之迷惑用delphi调用beep函数使喇叭发生,要达到以下功能:按下某个按键的时候,发出1000hz的声音

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获得焦点时, 按下任意键即可发出指定频率的声音, 释放按键声音即刻停止。

热点排行