如何消除Delphi OnCloseQuery事件中MessageDlg的提示音?
消除Delphi MessageDlg提示音的几种方法
在Delphi 10.4中,MessageDlg会根据消息类型(如mtConfirmation)播放系统默认提示音。要解决关闭程序确认框的提示音问题,可采用以下几种方案:
方法一:使用自定义对话框(推荐)
通过CreateMessageDialog创建自定义对话框,指定mtCustom类型避免默认提示音,同时手动添加图标保持视觉一致性:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var Dlg: TForm; ResultCode: Integer; begin Dlg := CreateMessageDialog('Do you wish to close the DertSQL program?', mtCustom, [mbYes, mbNo]); try // 添加确认图标,匹配原对话框视觉效果 Dlg.Icon.Handle := LoadIcon(0, IDI_QUESTION); // 设置默认按钮为No,与原逻辑一致 Dlg.DefaultButton := mbNo; ResultCode := Dlg.ShowModal; finally Dlg.Free; end; CanClose := (ResultCode = mrYes); end;
此方法完全规避默认提示音,且不会影响系统其他设置,是最优选择。
方法二:暂时禁用系统蜂鸣
调用MessageDlg前先关闭系统蜂鸣,完成后恢复原设置:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var iOkToClose: integer; OldBeepState: BOOL; begin // 保存当前系统蜂鸣状态 SystemParametersInfo(SPI_GETBEEP, 0, @OldBeepState, 0); // 临时关闭系统蜂鸣 SystemParametersInfo(SPI_SETBEEP, 0, Pointer(FALSE), SPIF_SENDCHANGE); try iOkToClose := MessageDlg('Do you wish to close the DertSQL program?', mtConfirmation, [mbYes, mbNo], 0, mbNo); finally // 恢复原蜂鸣设置 SystemParametersInfo(SPI_SETBEEP, 0, @OldBeepState, SPIF_SENDCHANGE); end; CanClose := (iOkToClose = mrYes); end;
注意:此方法会短时间内关闭系统全局蜂鸣,可能影响其他程序的提示音。
方法三:调用Windows API MessageBox
直接使用系统API对话框,可通过标志控制显示效果(声音播放取决于系统声音方案设置):
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var MsgResult: Integer; begin MsgResult := MessageBox(Handle, 'Do you wish to close the DertSQL program?', PChar(Application.Title), MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2); CanClose := (MsgResult = ID_YES); end;
若需完全无声音,可移除MB_ICONQUESTION标志,但对话框会失去确认图标。
内容的提问来源于stack exchange,提问作者ASLANdata
相关产品推荐
相关产品推荐

