用delphi调用beep函数 使喇叭发生,要达到以下功能:按下某个按键的时候,发出1000hz的声音,当松掉按键的时候声音立刻停止,功能是实现了,不过 当按下按键的时候发出声音是连续的,松掉按键后声音并不是立刻停止 有延时 不知道怎么解决

解决方案 »

  1.   

    建议使用WinIO.DLL直接进行I/O端口读写来实现, WinIO.DLL可从此处下载: http://www.daqchina.net/daqchina/download/winio.zipunit U_WinIO;interfaceuses
      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.
      

  2.   

    先录好1Khz的声音(也可以用软件生成),然后用MediaPlayer来播放, 当然,播放中途你也可以停止它。
      

  3.   

    秀峰你好 谢谢你的解答 不过我还不太会加载dll文件,也参考了些资料 有些云里雾里的感觉,麻烦哪位大虾能在详细说明 谢谢了  
    前面也有人提议用播放器播放不过我不太想用这种方法,不过也谢谢强哥了。
      

  4.   

    WinIO.zip解压缩后, 有个Release目录,其中有三个文件:WinIo.dll, WinIo.sys和WINIO.VXD,只要把这三个文件复制到你的工程文件所在目录即可使用。
    然后你可以先测试一下我上面的代码,里面给出一WinIO.dll的几个主要的函数申明。
    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';
      

  5.   

    我觉得还是用SoundPlay API 函数直接播放WAV文件要好些吧?
      

  6.   

    程序修改一下, 增加上设置发音频率的代码: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获得焦点时, 按下任意键即可发出指定频率的声音, 释放按键声音即刻停止。