MessageDlg不发出声音

时间:2016-12-09 14:25:49

标签: delphi delphi-10-seattle

我有以下代码:

IF MessageDlg('Delete?',mtConfirmation,[mbYes,mbNo],0) = MrYes THEN
Begin
///Do Something;
End
Else
Begin
///Do Something;
End;

StyleWindows MessageDlg函数播放声音时,如果我将Style更改为Windows 10例如,那么声音确实如此不行。

  • 选择Style时为什么声音不存在?

  • 我该如何解决?

注意:我正在 Delphi 10 Seattle 工作。

更新

我在答案中尝试MessageBeep(MB_ICONQUESTION);作为David Heffernan建议,但这也不会发出声音。

2 个答案:

答案 0 :(得分:4)

使用Windows样式时,消息对话框由其中一个Windows消息对话框功能实现。这些将发出符合对话类型的标准系统声音。

使用VCL样式时,VCL代码负责对话框。它选择不发出系统声音。这只是使用VCL样式不精确实现的许多细节中的另一个。如果要在使用VCL样式时复制标准行为,则需要向MessageBeep添加适当的调用。

答案 1 :(得分:3)

为了补充David的答案,根据您的 Windows 版本,当前活动样式和其他人检查 MessageDlg 函数是否使用Custom TForm实现或使用 TTaskDialog 类(这是Windows Task Dialog的包装器)。因此,作为解决方法,您可以直接使用 TTaskDialog 类,并将Vcl.Styles.Hooks单元添加到项目中以设置这种对话框的样式。

uses
  Vcl.Styles.Hooks;

procedure TForm56.Button1Click(Sender: TObject);
var
 LTaskDialog : TTaskDialog;
begin
  LTaskDialog := TTaskDialog.Create(Self);
  try
    LTaskDialog.Caption := 'Confirm';
    LTaskDialog.Text := 'Delete ?';
    LTaskDialog.CommonButtons := [tcbYes, tcbNo];
    LTaskDialog.MainIcon := tdiInformation;
    if LTaskDialog.Execute then
      if LTaskDialog.ModalResult = mrYes then
      begin


      end;
  finally
    LTaskDialog.Free;
  end;