В современных версиях Delphi, в современных версиях Windows, ShowMessage
приводит к диалоговому окну Windows.Вы можете использовать WH_CBT
ловушку, чтобы поймать активацию этого диалогового окна.
function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
wnd: HWND;
ClassName: string;
begin
if nCode=HCBT_ACTIVATE then
begin
wnd := wParam;
SetLength(ClassName, 256);
SetLength(ClassName, GetClassName(wnd, PChar(ClassName), Length(ClassName)));
if (ClassName='#32770') or (ClassName='TMessageForm') then
Beep;
end;
Result := CallNextHookEx(0, nCode, wParam, lParam);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Hook: HHOOK;
begin
Hook := SetWindowsHookEx(WH_CBT, CBTProc, HInstance, GetCurrentThreadId);
if Hook=0 then
RaiseLastOSError;
try
ShowMessage('hello');
finally
if not UnhookWindowsHookEx(Hook) then
RaiseLastOSError;
end;
end;
Обратите внимание, что фактическое имя класса окна варьируется от системы к системе.В XP имя класса будет TMessageForm
, потому что диалог на самом деле является Delphi TForm
.Однако в Vista и более поздних версиях это диалоговое окно стандартного окна сообщения с именем класса окна #32770
.
Я показал, что это обернуто вокруг одного вызова ShowMessage
, но вы можете установить его по адресупри запуске, если вы хотите подключить все диалоговые окна сообщений, показанные в вашем приложении.