2010-06-15 61 views

回答

8

試試這個

uses MMSystem; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    sndPlaySound('C:\Windows\Media\sound.wav', 
    SND_NODEFAULT Or SND_ASYNC Or SND_LOOP); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    sndPlaySound(nil, 0); // Stops the sound 
end; 
+1

我喜歡這個 sndPlaySound( 'ding.wav',SND_ASYNC); – Tom 2010-06-15 07:26:34

+4

一定要編寫自己的函數「AppBeep」,不要在整個應用程序中調用sndPlaySound(hardcodedFilenameHere) ! – 2010-06-15 15:37:42

9

滑稽你應該問。我剛剛閱讀了關於窗口嗶嗶聲的歷史。美國殘疾人行爲已經迫使嗶嗶API在過去的20年裏不會改變。

http://blogs.msdn.com/b/larryosterman/archive/2010/01/04/what-s-up-with-the-beep-driver-in-windows-7.aspx

對於Windows 7,我們解決了這個問題 完全 - 我們感動了所有 功能曾經是包含在Beep.Sys 到用戶 模式系統聲音劑 - 現在當 你調用嘟嘟()API而不是 操縱8254芯片的呼叫是 重新路由到用戶模式代理,其中 實際上播放的聲音。

所以簡短的回答是:獲取Windows 7. 較長的答案是:不要使用嘟嘟api。聽到嘟嘟聲,併發揮它就像你會發揮任何其他噪音。

+1

難道你不覺得操作系統升級是想要改變嗶聲的矯枉過正嗎? – 2010-06-15 13:22:40

+1

嗯,@Ken,如果你想專門調用'Beep' *和*你想要一個不同的聲音,那麼一個新的OS是你唯一的選擇,因此不會矯枉過正。 – 2010-06-15 14:59:20

+1

嗯...... @Rob,如果你打算特意使用Beep(),而不是改變你的操作系統而不是改變你的代碼來使用別的東西,我會懷疑你的某個地方有螺絲鬆動。 ;-) – 2010-06-15 19:04:50

9

如果您想使用Windows使用顯示一個MessageBox的時候,你可以叫Windows.MessageBeep(MessageID)其中MESSAGEID映射到的圖標的ID相同的值的MessageBox(MB_OK,MB_ERROR等)「標準」的蜂鳴聲。

這樣做的一個問題是,用戶可以將任何聲音或沒有聲音映射到特定的ID。

+3

關閉聲音的人不是問題!它當然不應該。您的用戶界面不應該依賴聲音。有些人在那裏聽不到聲音,即使Windows仍然配置成它們... – 2010-06-15 12:55:53

+0

@Marjan事實上,它不應該是 - 它應該完全取決於計算機用戶。使用MessageBeep使程序更像Windows本身,這通常是一件好事 – 2010-06-15 22:02:37