beep函数调用之迷惑 用delphi调用beep函数 使喇叭发生,要达到以下功能:按下某个按键的时候,发出1000hz的声音,当松掉按键的时候声音立刻停止,功能是实现了,不过 当按下按键的时候发出声音是连续的,松掉按键后声音并不是立刻停止 有延时 不知道怎么解决 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议使用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. 先录好1Khz的声音(也可以用软件生成),然后用MediaPlayer来播放, 当然,播放中途你也可以停止它。 秀峰你好 谢谢你的解答 不过我还不太会加载dll文件,也参考了些资料 有些云里雾里的感觉,麻烦哪位大虾能在详细说明 谢谢了 前面也有人提议用播放器播放不过我不太想用这种方法,不过也谢谢强哥了。 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'; 我觉得还是用SoundPlay API 函数直接播放WAV文件要好些吧? 程序修改一下, 增加上设置发音频率的代码:procedure TForm1.FormCreate(Sender: TObject);const BeepFreq = 1000; //发音频率1000Hzvar 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获得焦点时, 按下任意键即可发出指定频率的声音, 释放按键声音即刻停止。 日期计算的一些问题 delphi7.0的一个问题 求ImageDirectoryEntryToData的声明方法 请大家参谋,关于这个项目设计,多谢。 请教:怎样实现查找局域网中所有oracle服务器 请教各位高手,为什么我每次客户端连接服务端的时候,服务端会出现异步错误? ftp搜索??? CSDN要求太苛刻,建议大家维护一个心目中高手,中手的列表,定期up,帮助我们这些新手 后台thread 比较字符串的大小 adoconnection问题 这个功能怎么实现?应该是很简单的,分不够可以再加
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.
前面也有人提议用播放器播放不过我不太想用这种方法,不过也谢谢强哥了。
然后你可以先测试一下我上面的代码,里面给出一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';
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获得焦点时, 按下任意键即可发出指定频率的声音, 释放按键声音即刻停止。