你可以用SystemParametersInfo 输入参数SPI_SETBEEP 来完成这个操作Private Declare Function SystemParametersInfo Lib "user32.dll" Alias _ "SystemParametersInfoA" (ByVal uAction As Long, ByVal uiParam As Long, _ pvParam As Any, ByVal fWinIni As Long) As Long Private Const SPI_GETBEEP = 1 Private Const SPI_SETBEEP = 2 Private Const SPIF_SENDWININICHANGE = &H2 Private Const SPIF_UPDATEINIFILE = &H1Private Function SetSysBeep(ByVal New_SysBeep As Boolean) SystemParametersInfo SPI_SETBEEP, CLng(New_SysBeep), 0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE End Function 传如true,false来开关
我就是在2000下测试的: 我又加了一个get信息来验证是否修改成功Option Explicit Private Declare Function SystemParametersInfo Lib "user32.dll" Alias _ "SystemParametersInfoA" (ByVal uAction As Long, ByVal uiParam As Long, _ pvParam As Any, ByVal fWinIni As Long) As Long Private Const SPI_GETBEEP = 1 Private Const SPI_SETBEEP = 2 Private Const SPIF_SENDWININICHANGE = &H2 Private Const SPIF_UPDATEINIFILE = &H1 Private Function SetSysBeep(ByVal New_SysBeep As Boolean) SystemParametersInfo SPI_SETBEEP, CLng(New_SysBeep), 0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE End Function Private Sub Command1_Click() If GetSysBeep Then SetSysBeep False Else SetSysBeep True End If End SubPrivate Function GetSysBeep() As Boolean Dim ret As Long SystemParametersInfo SPI_GETBEEP, 0, ret, 0 GetSysBeep = CBool(ret) End Function
to ch21st(风尘鸟.shannon): 谢谢你的帮忙,上面的代码我刚才测试过了,确实可以屏蔽掉beep的声音,不过还存在如下问题: 在系统2000下,在文本框中做有效性检查时,即使beep时没有声音,但弹出msgbox时仍然 有声音,怎样把弹出msgbox时的声音屏蔽掉? 非常感谢。
这个beep其实用两种,vbA中的beep函数当你安装声卡,会变成从喇叭发生 而api的beep是从pc喇叭 msgbx的beep应该和api的MessageBeep保持一致,从声卡发声。你可以在2000做这样那个测试 1 Private Declare Function MessageBeep Lib "user32" (ByVal wType As Long) As Long Private Sub Form_Load() Dim Cnt As Byte 'Beep 5 times For Cnt = 1 To 5 MessageBeep 0 Next Cnt End Sub 2 Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Private Sub Form_Activate() Dim Cnt As Long For Cnt = 0 To 5000 Step 10 Beep Cnt, 50 Me.Caption = Cnt DoEvents Next Cnt End Sub第二个beep可以用pc喇叭演奏音乐,你看有什么不同,我上边说的设置方法其实禁止的是api beep,不是MessageBeep 至于怎样禁止MessageBeep 让我在研究一下
你还记得windows的控制面版的声音设置中,有设置各种情况播放的声音吧, MessageBeep就是从注册表读取这个设定值,然后发生,同样vb的magbox就是这样干的相当于 MessageBeep传入MB_OK参数 (1 Simple beep. If the sound card is not available, the sound is generated using the speaker. MB_ICONASTERISK SystemAsterisk MB_ICONEXCLAMATION SystemExclamation MB_ICONHAND SystemHand MB_ICONQUESTION SystemQuestion MB_OK SystemDefault ) 如果没有声卡它自动调用beep用pc喇叭发音。(vb中的beep函数不等价api的beep) 说了这么多你应该知道想禁止msgbox的声音怎么做了
在windows的system32/drivers/的目录下有个beep.sys的文件,把它删掉
就可以了
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uiParam As Long, _
pvParam As Any, ByVal fWinIni As Long) As Long
Private Const SPI_GETBEEP = 1
Private Const SPI_SETBEEP = 2
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1Private Function SetSysBeep(ByVal New_SysBeep As Boolean)
SystemParametersInfo SPI_SETBEEP, CLng(New_SysBeep), 0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE
End Function
传如true,false来开关
有声音,怎样把弹出msgbox时的声音屏蔽掉?谢谢各位!!!
我又加了一个get信息来验证是否修改成功Option Explicit
Private Declare Function SystemParametersInfo Lib "user32.dll" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uiParam As Long, _
pvParam As Any, ByVal fWinIni As Long) As Long
Private Const SPI_GETBEEP = 1
Private Const SPI_SETBEEP = 2
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Function SetSysBeep(ByVal New_SysBeep As Boolean)
SystemParametersInfo SPI_SETBEEP, CLng(New_SysBeep), 0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE
End Function
Private Sub Command1_Click()
If GetSysBeep Then
SetSysBeep False
Else
SetSysBeep True
End If
End SubPrivate Function GetSysBeep() As Boolean
Dim ret As Long
SystemParametersInfo SPI_GETBEEP, 0, ret, 0
GetSysBeep = CBool(ret)
End Function
仅使用95 98的入口参数:
SPI_GETANIMATION = 72
SPI_GETDEFAULTINPUTLANG = 89
SPI_GETHIGHCONTRAST = 66
SPI_GETICONMETRICS = 45
SPI_GETKEYBOARDPREF = 68
SPI_GETLOWPOWERACTIVE = 83
SPI_GETLOWPOWERTIMEOUT = 79
SPI_GETMINIMIZEDMETRICS = 43
SPI_GETMOUSETRAILS = 94
SPI_GETNONCLIENTMETRICS = 41
SPI_GETPOWEROFFACTIVE = 84
SPI_GETPOWEROFFTIMEOUT = 80
SPI_GETSCREENREADER = 70
SPI_GETSERIALKEYS = 62
SPI_GETWINDOWSEXTENSION = 92
SPI_GETWORKAREA = 48
SPI_LANGDRIVER = 12
SPI_SETANIMATION = 73
SPI_SETDEFAULTINPUTLANG = 90
SPI_SETDRAGWIDTH = 76
SPI_SETHIGHCONTRAST = 67
SPI_SETICONMETRICS = 46
SPI_SETKEYBOARDPREF = 69
SPI_SETLANGTOGGLE = 91
SPI_SETLOWPOWERACTIVE = 85
SPI_SETLOWPOWERTIMEOUT = 81
SPI_SETMINIMIZEDMETRICS = 44
SPI_SETMOUSETRAILS = 93
SPI_SETNONCLIENTMETRICS = 42
SPI_SETPENWINDOWS = 49
SPI_SETPOWEROFFACTIVE = 86
SPI_SETPOWEROFFTIMEOUT = 82
SPI_SETSCREENREADER = 71
SPI_SETSERIALKEYS = 63
SPI_SETWORKAREA = 47
我的不完全统计,仅供参考。如果发现遗漏或错误,请执行到msdn查证
谢谢你的帮忙,上面的代码我刚才测试过了,确实可以屏蔽掉beep的声音,不过还存在如下问题:
在系统2000下,在文本框中做有效性检查时,即使beep时没有声音,但弹出msgbox时仍然
有声音,怎样把弹出msgbox时的声音屏蔽掉?
非常感谢。
而api的beep是从pc喇叭
msgbx的beep应该和api的MessageBeep保持一致,从声卡发声。你可以在2000做这样那个测试
1
Private Declare Function MessageBeep Lib "user32" (ByVal wType As Long) As Long
Private Sub Form_Load() Dim Cnt As Byte
'Beep 5 times
For Cnt = 1 To 5
MessageBeep 0
Next Cnt
End Sub
2
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Private Sub Form_Activate() Dim Cnt As Long
For Cnt = 0 To 5000 Step 10
Beep Cnt, 50
Me.Caption = Cnt
DoEvents
Next Cnt
End Sub第二个beep可以用pc喇叭演奏音乐,你看有什么不同,我上边说的设置方法其实禁止的是api beep,不是MessageBeep 至于怎样禁止MessageBeep 让我在研究一下
MessageBeep就是从注册表读取这个设定值,然后发生,同样vb的magbox就是这样干的相当于
MessageBeep传入MB_OK参数
(1 Simple beep. If the sound card is not available, the sound is generated using the speaker.
MB_ICONASTERISK SystemAsterisk
MB_ICONEXCLAMATION SystemExclamation
MB_ICONHAND SystemHand
MB_ICONQUESTION SystemQuestion
MB_OK SystemDefault
)
如果没有声卡它自动调用beep用pc喇叭发音。(vb中的beep函数不等价api的beep)
说了这么多你应该知道想禁止msgbox的声音怎么做了